Weitgehende Unterstützung für „Find“ mit „-exec … +“?

Weitgehende Unterstützung für „Find“ mit „-exec … +“?

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, xargsstattdessen dafür einzutreten, wenn es -exec … +verwendet werden könnte? (Natürlich würden Sie es verwenden, xargswenn 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 von xargs; ermöglicht beispielsweise xargsden Aufbau neuer Befehlszeilen, während der vorherige Befehl noch ausgeführt wird, und ermöglicht Ihnen die Angabe einer Anzahl parallel auszuführender Befehle. Die find ... -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 -print0Aktion „ “ ohnehin schon vorhanden war.

Antwort1

Die +Variante von -execwurde 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 -0Befehlssatz. Wenn -exec ... +verfügbar ist und die -0Unterstützung xargsnicht vorhanden ist, sind Sie mit ersterem definitiv besser dran; selbst mit -0gibt 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 xargsliegt 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 \0als Trennzeichen, sodass sie alle möglichen Dateinamen problemlos bearbeiten können.)

verwandte Informationen