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

Antwort per Email an