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?
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?
Antworten:
find . -exec <command> {} \;
für das aktuelle Verzeichnis als Stamm des Baums oder allgemein:
find <directory> -exec <command> {} \;
-name "*.c"
oder zum Beispiel -type d
für Verzeichnisse ...
find ... | xargs ...
Idiom, es verarbeitet Dateien in Stapeln und dies ist normalerweise schneller (weniger Prozesse werden gestartet).
Verwenden Sie die -print0
Suchoption und die -0
Option, um nach xargs
Datei- oder Verzeichnisnamen mit Leerzeichen zu suchen :
find {dir} -print0 | xargs -0r {command}
Die -print0
Option zum Suchen druckt die Dateinamen als NUL
durch Leerzeichen getrennte Liste aus, während die -0
Option xargs
zum Unterbrechen der Eingabe NUL
anstelle von Leerzeichen angewiesen wird . Da NUL
eines der Zeichen in Unix-Dateinamen nicht zulässig ist, kann es nicht als Teil eines Dateinamens verwechselt werden.
Die -r
Option ist vorhanden, damit xargs
Sie keinen Fehler erhalten, wenn keine Eingabe erfolgt.
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.
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.
Stellen Sie sicher, dass die Version des Befehls, den Sie verwenden, noch kein Flag für die rekursive Operation enthält. :)