Führen Sie am besten einen Befehl für jede Datei in einem Verzeichnisbaum aus

13

Es gibt eine Reihe von Möglichkeiten, dies zu tun, einschließlich Schleifen in Shell-Skripten, find und xargs. Welches ist das Beste und welches ist das Tragbarste?

Brian Lyttle
quelle

Antworten:

13
find . -exec <command> {} \;

für das aktuelle Verzeichnis als Stamm des Baums oder allgemein:

find <directory> -exec <command> {} \;
txwikinger
quelle
4
Auf einigen Systemen gibt es keine Option -exec, die Sie mit find verwenden können. | xargs <Befehl>
Hemant
4
In der Tat, und wenn Sie nach etwas filtern müssen, versuchen Sie -name "*.c"oder zum Beispiel -type dfür Verzeichnisse ...
Find kann überraschend komplexe Aufgaben ausführen. Die vollständige Liste der Optionen finden Sie auf der Manpage unixhelp.ed.ac.uk/CGI/man-cgi?find .
Lucas Jones
Möglicherweise möchten Sie auch auf Dateinamen mit Leerzeichen achten, die den Ansatz von -exec und xargs unterbrechen können. Siehe tinyurl.com/ygvgmw5
Shawn Chin
Wenn möglich, verwenden Sie das find ... | xargs ...Idiom, es verarbeitet Dateien in Stapeln und dies ist normalerweise schneller (weniger Prozesse werden gestartet).
Vonbrand
5

Verwenden Sie die -print0Suchoption und die -0Option, um nach xargsDatei- oder Verzeichnisnamen mit Leerzeichen zu suchen :

find {dir} -print0 | xargs -0r {command}

Die -print0Option zum Suchen druckt die Dateinamen als NULdurch Leerzeichen getrennte Liste aus, während die -0Option xargszum Unterbrechen der Eingabe NULanstelle von Leerzeichen angewiesen wird . Da NULeines der Zeichen in Unix-Dateinamen nicht zulässig ist, kann es nicht als Teil eines Dateinamens verwechselt werden.

Die -rOption ist vorhanden, damit xargsSie keinen Fehler erhalten, wenn keine Eingabe erfolgt.

dhd
quelle
3

Wenn Portabilität ein Problem ist, würde ich mich von Shell-spezifischen Methoden fernhalten (es gibt viele Leute, die viele verschiedene Shells verwenden, aber im Allgemeinen sind find und xargs wirklich grundlegende Werkzeuge, die niemand radikal ändern könnte). .

Wenn Sie die Basisargumente find und xargs verwenden, sollten Sie eine portablere Lösung finden.

nc3b
quelle
2

Wenn das Gruppieren von Argumenten akzeptabel ist, finden Sie | xargs liefert wahrscheinlich eine bessere Leistung, da es den Befehl wesentlich seltener ausführt als find -exec. Wenn Sie den Befehl jedes Mal für jede Datei ausführen oder im Unterverzeichnis der Datei ausführen möchten, sollten Sie wahrscheinlich find -exec oder -execdir verwenden.

In der Regel ist es vorzuziehen, sich von Shell-spezifischen Schleifen fernzuhalten. find & xargs reichen für die meisten Szenarien aus.

Eugen Anghel
quelle
1

Stellen Sie sicher, dass die Version des Befehls, den Sie verwenden, noch kein Flag für die rekursive Operation enthält. :)


quelle
0
find [args] -print | xargs {command}

Funktioniert am besten für mich.

Josh K
quelle
2
-1 Funktioniert nicht für Dateinamen mit Leerzeichen. Verwenden Sie besser find -print0 | xargs -0.
Starblue