Antworten:
Der Geschwindigkeitsunterschied ist unbedeutend.
Aber Sie müssen sicherstellen, dass:
Ihr Skript geht nicht davon aus, dass keine Datei Speicherplatz, Tabulator usw. im Dateinamen enthält. Die erste Version ist sicher, die zweite nicht.
Ihr Skript behandelt eine Datei, die mit " -
" beginnt, nicht als Option.
Ihr Code sollte also folgendermaßen aussehen:
find . -exec cmd -option1 -option2 -- {} +
oder
find . -print0 | xargs -0 cmd -option1 -option2 --
Die erste Version ist kürzer und einfacher zu schreiben, da Sie 1 ignorieren können, aber die zweite Version ist portabler und sicherer, da " -exec cmd {} +
" eine relativ neue Option in GNU findutils ist (seit 2005 haben viele laufende Systeme sie noch nicht). und es war vor kurzem fehlerhaft . Auch viele Leute wissen das nicht " -exec cmd {} +
", wie Sie aus anderen Antworten sehen können.
exec
wird die Ergebnisse so ausgegeben, wie sie gefunden wurden xargs
, wobei anscheinend gewartet wird, bis das gesamte Verzeichnis durchsucht ist, bevor in stdout geschrieben wird. Wenn Sie dies in einem großen Verzeichnis versuchen und es anscheinend xargs
nicht funktioniert, ist Geduld ratsam.
-print0
find gibt Dateinamen zurück, die durch Zeilenumbrüche getrennt sind. Zeilenumbrüche können jedoch auch Teil eines Dateinamens sein, wodurch sie mehrdeutig werden. Byte 0 kann nicht, daher ist es ein sicheres Trennzeichen. Ja - das Hinzufügen --
zu einem Befehl, der ihn unterstützt, ist eine gute Vorgehensweise, wenn Sie seine Argumente nicht kontrollieren können, auch wenn dies nicht immer unbedingt erforderlich oder unsicher ist.
find . | xargs cmd
ist effizienter (es läuft cmd
so wenig wie möglich, im Gegensatz zu exec
, die ausgeführt wird cmd
für jedes Spiel einmal). Sie werden jedoch auf Probleme stoßen, wenn Dateinamen Leerzeichen oder funky Zeichen enthalten.
Es wird empfohlen, Folgendes zu verwenden:
find . -print0 | xargs -0 cmd
Dies funktioniert sogar , wenn die Dateinamen enthalten flippige Zeichen ( -print0
Marken find
NUL-terminierten Matches drucken, -0
macht xargs
erwarten dieses Format.)
xargs
Ansatz tatsächlich erheblich langsamer ist, wenn keine (oder nur wenige) übereinstimmende Dateien vorhanden sind und cmd
nicht für jede Datei viel zu tun ist. Wenn die xargs
Version beispielsweise in einem leeren Verzeichnis ausgeführt wird, dauert sie mindestens doppelt so lange, da zwei Prozesse anstelle von nur einem gestartet werden müssen. (Ja, der Unterschied ist normalerweise auf * nix nicht wahrnehmbar, aber in einer Schleife könnte es wichtig sein; oder versuchen Sie es einige Zeit unter Windows ...)