Gemessen andas GNU Findutils-Änderungsprotokolles musste mindestens ein Jahrzehnt lang in GNU Find enthalten sein (und sogar noch länger, da es Teil von POSIX war), kann man also davon ausgehen, dass es jetzt überall unterstützt wird?
Gibt es außerdem gute Gründe, xargs
stattdessen dafür einzutreten, wenn es -exec … +
verwendet werden könnte? (Natürlich würden Sie es verwenden, xargs
wenn Sie einige dieser speziellen Parameter benötigen, wie z. B. die zur Steuerung der maximalen Anzahl von Argumenten, Parallelität usw.)
Ein interessantes Zitat vonein Teil der Dokumentation von GNU findutil:
[finden mit
-exec … +
]kann weniger effizient sein als einige Verwendungen vonxargs
; ermöglicht beispielsweisexargs
den Aufbau neuer Befehlszeilen, während der vorherige Befehl noch ausgeführt wird, und ermöglicht Ihnen die Angabe einer Anzahl parallel auszuführender Befehle. Diefind ... -exec ... +
Konstruktion hat jedoch den Vorteil der breiten Portabilität. GNU findutils unterstützte '-exec ... +
' erst ab Version 4.2.12[Januar 2005]; einer der Gründe dafür ist, dass die-print0
Aktion „ “ ohnehin schon vorhanden war.
Antwort1
Die +
Variante von -exec
wurde in POSIX eingeführt nachPASC-Interpretation 1003.2 #210im Jahr 2001 und wurde in Ausgabe 6 mit dem POSIX-Standard zusammengeführt (wie im aktuellen Standard dokumentiertfind(1)
Dokumentation). Laut der Interpretation wird es von allen Derivaten von System V Release 4 unterstützt, ebenso wie von HP-UX (im Jahr 2001 – ich weiß, dass HP-UX 10 es nicht unterstützte); offensichtlich wird es auch von allen POSIX-Version-6- oder 7-kompatiblen Systemen unterstützt.
Der GNU-ismus ist eigentlich der find -print0 | xargs -0
Befehlssatz. Wenn -exec ... +
verfügbar ist und die -0
Unterstützung xargs
nicht vorhanden ist, sind Sie mit ersterem definitiv besser dran; selbst mit -0
gibt es keinen Grund, es nicht zu verwenden, -exec ... +
wenn es das unterstützt, was Sie brauchen.
Antwort2
Kann man davon ausgehen, dass [
-exec ...
] mittlerweile überall unterstützt wird?
Es ist davon auszugehen, dass die -exec ... '{}' ';'
Variante, die genau eine Übereinstimmung pro ausgeführtem Befehl liefert, nun überall unterstützt wird, auch auf Nicht-POSIX-Unix-Systemen.
Die -exec ... '{}' +
Variante, da bin ich mir nicht sicher. Es stimmt, sie ist definiert inPOSIX-1, es wird also definitiv in allen aktuellen POSIXy-Systemen unterstützt. Ich bin mir jedoch nicht sicher, ob alle älteren Unix-Systeme (die noch im Einsatz sind) es unterstützen.
Gibt es gute Gründe, stattdessen für xargs zu plädieren, wenn [
-exec ... '{}' +
] verwendet werden könnte?
Nein, eigentlich nicht. Warum zwei Befehle verwenden, wenn einer ausreicht?
Das Problem ist eher, dass alle Probleme wie Nägel aussehen, wenn Sie nur einen Hammer als Werkzeug kennen. Die Leistungsfähigkeit von xargs
liegt darin, dass Sie die Liste der Übereinstimmungen mithilfe von bash
, sed
, awk
, usw. bearbeiten können, bevor Sie die Befehle ausführen, die auf die Liste einwirken.
(In der Praxis erfordert dies allerdings, dass die Datei- und Verzeichnisnamen keine eingebetteten Zeilenumbrüche enthalten. Bash und GNU find, sed, awk und xargs unterstützen alle das Nullzeichen \0
als Trennzeichen, sodass sie alle möglichen Dateinamen problemlos bearbeiten können.)