2010-01-18 5 views
35

Ich versuche, ein Array zu verwenden, um eine Liste von Dateinamen mit dem Befehl find zu speichern.Wie kann ich die Ergebnisse von find in einem Bash-Skript verarbeiten?

Aus irgendeinem Grund funktioniert das Array nicht in der Bash von der Schule verwendet, funktioniert mein Programm auf meinem eigenen Laptop.

Ich habe mich gefragt, ob es also einen anderen Weg, es zu tun, das ist, was ich habe: mit dem Befehl cat

array = (`find . -name "*.txt"`) #this will store all the .txt files into the array 

Dann kann ich die Array-Elemente zugreifen und eine Kopie aller Dateien machen.

Gibt es einen anderen Weg, es ohne ein Array zu tun?

Antwort

75

könnte man so etwas verwenden:

find . -name '*.txt' | while read line; do 
    echo "Processing file '$line'" 
done 

Z.B. eine Kopie:

find . -name '*.txt' | while read line; do 
    echo "Copying '$line' to /tmp" 
    cp -- "$line" /tmp 
done 

HTH

+0

vielen Dank !! es hat funktioniert und ich habe etwas Neues gelernt – Shellscriptbeginner

+0

Die Verwendung einer 'for' Schleife ist definitiv eine bessere Wahl hier. Die Verwendung eines Arrays würde funktionieren, außer dass es die gesamte Liste in eine Variable liest und dann über die Variable iteriert. Diese Version liest jeden Dateinamen, wie er aus 'find' kommt und verarbeitet ihn inline. –

+0

D.Shawley, könnten Sie bitte ein Beispiel mit einer for-Schleife posten? Es sollte auch für Dateien mit Leerzeichen im Namen funktionieren, denke ich. –

2
find . -name '*.txt' | while IFS= read -r FILE; do 
    echo "Copying $FILE.." 
    cp "$FILE" /destination 
done 
6

Nur nicht setzen Zuschnitte um das Gleichheitszeichen:

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

Vermeiden Backticks, wenn möglich, da sie veraltet sind. Sie können leicht mit Apostroph verwechselt werden, besonders in schlechten Schriften, und sie nisten nicht so gut.

In den meisten Fällen werden Sie am besten bedient, wenn Sie ein Finder-Ergebnis direkt mit -exec, -execdir, -ok oder -okdir durchlaufen.

For und While-Schleifen sind schwer zu tun, wenn es um Leerzeichen in Dateinamen oder Zeilenumbrüche und Tabs geht.

find ./ -name "*.txt" -exec grep {} ";" 

Die {} muss nicht maskiert werden. Sie oftmals eine Kombination sehen finden/xargs, die auch einen zusätzlichen Prozess beginnt:

find ./ -name "*.txt" | xargs grep {} ";" 
14

Ich hatte Problem mit Johannes Weiß-Lösung, wenn ich ein Echo gerade tat es für die vollständige Liste der Dateien funktionieren würde. Wenn ich jedoch ffmpeg in der nächsten Zeile ausführen wollte, würde das Skript nur die erste gefundene Datei verarbeiten. Ich nahm einige IFS witziges Geschäft wegen der Leitung an, aber ich konnte es nicht herausfinden und lief mit einer for-Schleife stattdessen:

for i in $(find . -name '*.mov'); 
do 
    echo "$i" 
done 
+1

Dies scheitert bei Leerzeichen in Dateinamen – spinup