Patrick Schulz wrote:
Markus Schönhaber schrieb:
Da die maximale Pfadlänge aber deutlich geringer ist als die maximale
Länge der Parameterliste, dürften besagte Einschränkungen für das zur
Diskussion stehende Problem nicht von Bedeutung sein.
Da bin ich mir nicht so sicher.
Wir reden hier über mehrere Hunderttausend Dateien...
...was im Bezug auf die Längenbeschränkung der Parameterliste in diesem Fall
ohne Bedeutung ist, wie Du weiter unten ja selbst feststellst.
Ich bin mir nicht sicher in wie weit das geschilderte Problem auch
garantiert zu lösen ist.
Dein Vorschlag über while read an die Lösung heran zu gehen, scheint
zumindest in Bezug auf die Parameteranzahl kein Problem zu sein.
Aber ich glaube, eben habe ich mir meinen Holzweg selbst erklärt.
- Die Ein- und Ausgabe von xargs ist an sich ja keine Parameterliste,
sondern ein Stream
- Die Ausgabe des des find command ebenfalls
In so fern kommt in keinem der Fälle das Problem mit der Parameteranzahl
zum Tragen. Korrekt?
Genau.
Die Längenbeschränkung der Parameterliste kommt erst dadurch ins Spiel, daß
sowohl find -exec als auch xargs weitere Prozesse starten. Die Argumente, die
sie diesen zu startenden Prozessen auf den Weg geben, dürfen eben
längentechnisch einen bestimmten Wert nicht überschreiten.
Aber wie schon gesagt: Die maximale Länge der Parameterliste ist deutlich
größer als die maximale Länge eines Pfadnamens. Im schlimmsten Fall müßte
xargs also für jedes einzelene Parameterelement, das es von stdin liest,
einen neuen Prozess starten und könnte diesem nicht gleich mehrere mitgeben,
wie es das standardmäßig tut. Und find -exec startet m. W. sowieso für jeden
Treffer erneut den jeweiligen Prozess.
BTW: Meinen Verständnis nach ist einer der Gründe für die Existenz von xargs
ja gerade, daß man damit die Längenbeschränkung der Parameterliste umgehen
kann. Wenn Du bspw. ein Verzeichnis mit den von Dir erwähnten mehreren
hunderttausend Dateien hast, wird ein
cp * /irgend/wo/hin
vermutlich fehlschlagen, während
ls | xargs cp --target-directory=/irgend/wo/hin
problemlos funktionieren sollte[1].
Gruß
mks
[1] Sicher, wenn die Ausgabe von ls auch Verzeichnisnamen, Namen mit
Leerzeichen etc. enthält, wird das in diesem Beispiel Probleme geben. Aber es
dürfte klar sein, worauf ich hinaus will.
--
PUG - Penguin User Group Wiesbaden - http://www.pug.org