428 Stimmen

Wie kann man eine Schleife durch die von find zurückgegebenen Dateinamen ziehen?

x=$(find . -name "*.txt")
echo $x

Wenn ich den obigen Code in der Bash-Shell ausführe, erhalte ich eine Zeichenkette mit mehreren durch Leerzeichen getrennten Dateinamen, keine Liste.

Natürlich kann ich sie weiter nach Leerzeichen trennen, um eine Liste zu erhalten, aber ich bin sicher, dass es einen besseren Weg gibt, dies zu tun.

Wie kann man also am besten eine Schleife durch die Ergebnisse einer find Befehl?

3voto

Jahid Punkte 19666

Sie können die Dateinamen, die von find in ein Array wie dieses:

array=()
while IFS=  read -r -d ''; do
    array+=("$REPLY")
done < <(find . -name '*.txt' -print0)

Jetzt können Sie das Array in einer Schleife durchlaufen, um auf einzelne Elemente zuzugreifen und mit ihnen zu tun, was Sie wollen.

Anmerkung: Der weiße Raum ist sicher.

3voto

Florian Punkte 342

Basierend auf anderen Antworten und dem Kommentar von @phk, unter Verwendung von fd #3:
(was immer noch erlaubt, stdin innerhalb der Schleife zu verwenden)

while IFS= read -r f <&3; do
    echo "$f"

done 3< <(find . -iname "*filename*")

2voto

Rakholiya Jenish Punkte 3055

Sie können Ihre find Ausgabe in Array, wenn Sie die Ausgabe später als verwenden möchten:

array=($(find . -name "*.txt"))

Um nun die einzelnen Elemente in einer neuen Zeile zu drucken, können Sie entweder for Schleife, die alle Elemente des Arrays durchläuft, oder Sie können die printf-Anweisung verwenden.

for i in ${array[@]};do echo $i; done

oder

printf '%s\n' "${array[@]}"

Sie können auch verwenden:

for file in "`find . -name "*.txt"`"; do echo "$file"; done

Damit wird jeder Dateiname mit einem Zeilenumbruch ausgegeben

Um nur den Druck der find in Listenform ausgeben möchten, können Sie eine der folgenden Möglichkeiten nutzen:

find . -name "*.txt" -print 2>/dev/null

oder

find . -name "*.txt" -print | grep -v 'Permission denied'

Dadurch werden Fehlermeldungen entfernt und nur der Dateiname als Ausgabe in einer neuen Zeile ausgegeben.

Wenn Sie etwas mit den Dateinamen machen wollen, ist es gut, sie in einem Array zu speichern, andernfalls ist es nicht nötig, diesen Platz zu verbrauchen und Sie können direkt die Ausgabe von find .

0voto

S.Doe_Dude Punkte 103
function loop_through(){
        length_="$(find . -name '*.txt' | wc -l)"
        length_="${length_#"${length_%%[![:space:]]*}"}"
        length_="${length_%"${length_##*[![:space:]]}"}"   
        for i in {1..$length_}
        do
            x=$(find . -name '*.txt' | sort | head -$i | tail -1)
            echo $x
        done

}

Um die Länge der Liste der Dateien für die Schleife zu ermitteln, habe ich den ersten Befehl "wc -l" verwendet.
Dieser Befehl wird auf eine Variable gesetzt.
Dann muss ich die nachgestellten Leerzeichen aus der Variablen entfernen, damit die for-Schleife sie lesen kann.

-1voto

chetangb Punkte 59

find <path> -xdev -type f -name *.txt -exec ls -l {} \;

Dadurch werden die Dateien aufgelistet und Details zu den Attributen angezeigt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X