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 Sie xargs --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 so find
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, angegeben xargs --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ühren
find / -exec echo {} + | wc -cl
Da die Ausgabe von find
für jeden echo
Aufruf eine Zeile enthält , können sie mit gezählt werden wc -l
. Die Gesamtzahl der Bytes echo
ist die Ausgabe von wc -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).
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?