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

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

Es scheint eine Reihe von Möglichkeiten zu geben, dies zu tun, einschließlich Schleifen in Shell-Skripten, Find und Xargs. Welche davon ist die beste und welche ist am portabelsten?

Antwort1

find . -exec <command> {} \;

für das aktuelle Verzeichnis als Wurzel des Baumes oder allgemein:

find <directory> -exec <command> {} \;

Antwort2

Verwenden Sie die -print0Optionen „Suchen“ und „ -0Zu“ xargs, wenn Sie Datei- oder Verzeichnisnamen mit Leerzeichen haben:

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

Die -print0Option find gibt die Dateinamen als NUL-getrennte Liste aus, statt als durch Leerzeichen getrennte Liste, während die -0Option to xargsanweist, die Eingabe bei NULstatt bei Leerzeichen zu unterbrechen. Da NULes sich um eines der Zeichen handelt, die in Unix-Dateinamen nicht zulässig sind, kann es nicht mit einem Teil eines Dateinamens verwechselt werden.

Die -rOption ist vorhanden, sodass xargsbei fehlender Eingabe kein Fehler auftritt.

Antwort3

Wenn die Portabilität ein Problem darstellt, würde ich Shell-spezifische Vorgehensweisen meiden (es gibt viele Leute, die viele verschiedene Shells verwenden, aber im Allgemeinen sind Find und Xargs wirklich grundlegende Tools, die niemand radikal zu ändern wagen würde).

Die Verwendung der grundlegenden Argumente „find“ und „xargs“ sollte Ihnen eine portablere Lösung bieten.

Antwort4

Stellen Sie sicher, dass die von Ihnen verwendete Befehlsversion nicht bereits über ein Flag für rekursive Vorgänge verfügt. :)

verwandte Informationen