Welches ist effizienter als ein sehr großer Satz von Dateien und sollte verwendet werden?
find . -exec cmd {} +
oder
find . | xargs cmd
(Angenommen, die Dateinamen enthalten keine lustigen Zeichen.)
linux
unix
command-line
find
Dogbane
quelle
quelle
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:
oder
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.quelle
exec
wird die Ergebnisse so ausgegeben, wie sie gefunden wurdenxargs
, 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 anscheinendxargs
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.ist effizienter (es läuft
cmd
so wenig wie möglich, im Gegensatz zuexec
, die ausgeführt wirdcmd
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:
Dies funktioniert sogar , wenn die Dateinamen enthalten flippige Zeichen (
-print0
Markenfind
NUL-terminierten Matches drucken,-0
machtxargs
erwarten dieses Format.)quelle
xargs
Ansatz tatsächlich erheblich langsamer ist, wenn keine (oder nur wenige) übereinstimmende Dateien vorhanden sind undcmd
nicht für jede Datei viel zu tun ist. Wenn diexargs
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 ...)Moderne
xargs
Versionen unterstützen häufig die parallele Pipeline-Ausführung.Offensichtlich könnte es ein Dreh- und Angelpunkt sein, wenn es um die Wahl zwischen
find … -exec
und geht… | xargs
quelle