Das Ende des primären Ausdrucks wird durch ein <semicolon> oder ein <plus-sign> unterbrochen. Nur ein <plus-sign>, das unmittelbar auf ein Argument folgt, das nur die beiden Zeichen "{}" enthält, darf das Ende des primären Ausdrucks markieren. Andere Verwendungen des <plus-sign> werden nicht als besonders behandelt. Wenn der primäre Ausdruck durch ein <Semikolon> unterbrochen wird , wird der Dienstprogrammname für jeden Pfadnamen einmal aufgerufen, und der primäre Ausdruck wird als wahr ausgewertet, wenn das Dienstprogramm einen Nullwert als Beendigungsstatus zurückgibt. Ein Dienstprogrammname oder ein Argument, das nur die beiden Zeichen "{}" enthält, wird durch den aktuellen Pfadnamen ersetzt. Wenn ein Dienstprogrammname oder ein ArgumentDie Zeichenfolge enthält die beiden Zeichen "{}", aber nicht nur die beiden Zeichen "{}". Es ist implementierungsdefiniert, ob find diese beiden Zeichen ersetzt oder die Zeichenfolge unverändert verwendet.
Wenn der primäre Ausdruck durch ein <plus-sign> unterbrochen wird, wird der primäre immer als wahr ausgewertet, und die Pfadnamen, für die der primäre Ausdruck ausgewertet wird, werden zu Mengen zusammengefasst. Das Dienstprogramm Utility_name
wird für jeden Satz aggregierter Pfadnamen einmal aufgerufen. Jeder Aufruf wird beginnen , nachdem der letzte Pfad in dem Satz zusammengefasst wird, und wird vor den abgeschlossen seinem Fund Dienstprogramm Ausfahrten und vor dem ersten Pfad in dem nächsten Satz (falls vorhanden) ist für diesen primären aggregiert, aber es ist anders , nicht spezifiziert , ob der Aufruf tritt vor, während oder nach den Bewertungen anderer Vorwahlen auf. Wenn ein Aufruf einen Wert ungleich Null als Exit-Status zurückgibt, wird die Suche ausgeführt
Das Dienstprogramm muss einen Exit-Status ungleich Null zurückgeben. Ein Argument, das nur die beiden Zeichen "{}" enthält, wird durch die Menge der aggregierten Pfadnamen ersetzt, wobei jeder Pfadname als separates Argument in der gleichen Reihenfolge an das aufgerufene Dienstprogramm übergeben wird, in der er aggregiert wurde. Die Größe eines Satzes von zwei oder mehr Pfadnamen muss so begrenzt sein, dass die Ausführung des Dienstprogramms nicht dazu führt, dass das {ARG_MAX} -Limit des Systems überschritten wird . Wenn mehr als ein Argument mit den beiden Zeichen "{}" vorhanden ist, ist das Verhalten nicht angegeben.
find / -exec echo | wc
und das Verhältnis zwischen Zeichenanzahl und Zeilenanzahl gemessen. Ich habe festgestellt, dass die maximale Befehlszeilenlänge, die von verwendetfind
wird, erheblich kleiner als die theoretische POSIX-Grenze ist und viel näher an derSize of command buffer we are actually using
Zeile in der Ausgabe von liegtxargs --show-limits
. Dies gilt für Linux und möglicherweise für die Mac OS-Implementierung vonfind
, obwohlxargs
der Wert in Mac OS nicht gedruckt wird. Irgendeine Idee, warum das passiert?--show-limits
wird von POSIX nicht angegeben, die Mac OS-Implementierung vonxargs
unterstützt es nicht.find / -exec echo | wc
wird nicht funktionieren. Denken Sie daran, dassARG_MAX
Rückgabebytes. Und es ist die maximale Länge der Argumente für dieexec(3)
Funktionen.--show-limits
es sich nicht um POSIX handelt, obwohl dies nicht die maximale Argumentlänge ist, die von verwendet wirdfind
und die einen kleineren Wert verwendet. Ich verstehe nicht, warum Sie sagen, dassfind / -exec echo | wc
das nicht funktioniert: Meiner Meinung nach ist es eine gute Möglichkeit, den tatsächlichen Wert abzuschätzen (und nach dem, was ich sehen kann, besser als zu verwendengetconf ARG_MAX
). Außerdem besteht mein Dateisystem meistens aus allen ASCII-Zeichen, sodass die Anzahl der Zeichen ungefähr der Anzahl der Bytes entspricht.find / -exec sh -c 'echo $@ | wc -c' _ {} +
isntead.find / -exec echo {} + | wc -lc
Es gibt eine maximale Länge der Argumentliste für einen neuen Prozess im POSIX-System.
find
teilt die Ausführung auf, wenn die Dateipfade länger sind. Um das Limit unter Linux zu sehen, verwenden Siexargs --show-limits
(funktioniert nicht unter Mac OS, wenn jemand eine bessere Alternative kennt, kommentieren Sie bitte hier)edit: direkt aus Gnoucs Antwort gestohlen, der POSIX-Weg, um die maximale Länge der Argumentliste zu erhalten, ist
getconf ARG_MAX
. Ich habe jedoch ein Experiment auf meinem Mac OS-Computer durchgeführt, und es sieht sofind
aus, als würde etwas mehr als die Hälfte dieser Zahl verwendet. Dies steht im Einklang mit der Tatsache, dass auf dem System, auf dem es funktioniert, angegebenxargs --show-limits
wird, dass nicht die maximale Argumentlänge verwendet wird (auch in diesem Fall wird etwa die Hälfte dieser Zahl verwendet), ich konnte jedoch keine Erklärung finden dafür.edit 2: Es scheint, dass die einzige zuverlässige Methode, um zu bestimmen, wie viele Parameter
find
für jeden Aufruf zusammenhalten, das Experimentieren ist, beispielsweise durch AusführenDa die Ausgabe von
find
für jedenecho
Aufruf eine Zeile enthält , können sie mit gezählt werdenwc -l
. Die Gesamtzahl der Bytesecho
ist die Ausgabe vonwc -c
stattdessen. Wenn Sie eine durch die andere teilen, erhalten Sie die durchschnittliche Anzahl von Bytes in den Parametern für jeden Befehlsaufruf (wenn auch aufgrund der Rundung ein etwas niedrigerer Wert, ungefähr die Hälfte der durchschnittlichen Länge eines Pfads in Ihrem System).quelle
xargs
verwendet nicht die volle maximale Argumentlänge, da viele Programme einige zusätzliche Argumente voranstellen und die Argumente dann an andere Programme übergeben. Wennxargs
die Argumente bis zum absoluten Maximum gefüllt werden, werden solche Programme unterbrochen, da für diese zusätzlichen Argumente kein Platz mehr wäre.xargs
oder verwendet wirdfind
?yes . | xargs | head -n 1 | wc -c
indem Sie bestimmen, wie viele Argumente beim ersten Aufruf übergeben wurden (so etwas wie ) und diese mit der Ausgabe von vergleichengetconf ARG_MAX
. Aber wenn ich es tatsächlich auf meinem System versuche, bekomme ich einen Unterschied, der so groß ist, dass es so aussieht, als ob mehr dahinter steckt, als mir bewusst ist.