Re: [PUG] Re: [Shellscript] Länge von Dateinamen ermitteln

2006-10-29 Diskussionsfäden Markus Schönhaber
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


[PUG] Re: [Shellscript] Länge von Dateinamen ermitteln

2006-10-27 Diskussionsfäden Jochen Hein
Patrick Schulz [EMAIL PROTECTED] writes:

 Allerdings scheint es da ein Problem mit Namen zu geben, die ein
 Leerzeichen enthalten.
 Wie kann man das umgehen?

Etwa find . -print0 | xargs -0 ... als Schleifenkonstrukt.
Wird dann aber wieder unübersichtlich...

Jochen

-- 
#include ~/.signature: permission denied
-- 

PUG - Penguin User Group Wiesbaden - http://www.pug.org


[PUG] Re: [Shellscript] Länge von Dateinamen ermitteln

2006-10-26 Diskussionsfäden Jochen Hein
Patrick Schulz [EMAIL PROTECTED] writes:

 ich würde gerne herausfinden, welche Dateien oder Verzeichnisse
 unterhalb eines Startverzeichnisses einen Namen länger als x Zeichen
 habe. Wie mache ich das?

man bash liefert den wichtigsten Trick:

for i in $(find .); do
   name=$(basename $i)
   [ ${#name} -gt 10 ]  echo $i
done

Jochen

-- 
#include ~/.signature: permission denied
-- 

PUG - Penguin User Group Wiesbaden - http://www.pug.org