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 dfür Verzeichnisse ...
find ... | xargs ...Idiom, es verarbeitet Dateien in Stapeln und dies ist normalerweise schneller (weniger Prozesse werden gestartet).
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.
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. :)