On Don, 12 Sep 2002 at 11:22 (+0200), Andreas Kyek wrote:
On 12 Sep 2002 at 10:56, David Haller wrote:
[...]
Ack. Aber: das 'for' scheitert (genauso) bald an der Expandierung des '*'. Die Schleife hilft hier also nicht weiter (oder hast du nen Gegenbeweis? So bei sagen wir 20k Verz. in /home?), da das /home/* in beiden Faellen von der Shell expandiert wird.
eben nicht!
Ich habe bisher nicht verstanden, wieso nicht. Aber z.B. ein "rm *20020910*" ausgeführt in bestimmten Log-Verzeichnissen hier scheitert IMMER, dagegen wird eine for-Schleife über die gleiche Filemenge problemlos ausgeführt.
Kann ich bestätigen. Den Trick mit der for-Schleife habe ich im Falle einer Anwendungs-SW (Cross-Basic auf SINIX), die historisch bedingt (Cross-Interpreter für Quattro-8870-SW) zigtausende Dateien in ein Basis-Verzeichnis knallte, oft anwenden müssen. Erklärungsversuch: Es geht nicht um einen Puffer der Shell, sondern um den Puffer für die Kommandozeilen-Argumente. Die Fehlermeldung besagt ja auch ungefähr *argument list too long*. for ist ein Shell-Builtin und wird demzufolge nicht als eigener Prozess mit Argumentliste gestartet.
Falls jemand dafür eine plausible Erklärung hat: her damit!
Geht das so? ;-)
Dann ist also sowieso was besseres gefragt, z.B.:
find /home/ -type d -maxdepth 1 -exec du -sk {} \;
(ungetestet).
Das geht natürlich auch. (Und wie immer gibt es unter Unix/Linux mehr als einen Weg, der zum Ziel führt)
ACK. Die for-Schleife lässt sich aber leichter erweitern, wenn man nicht nur einen Befehl pro Verzeichnis unterbringen will. find hat dafür den Vorteil, dass man statt exec (pro Treffer ein Prozess) die Kombination -print | xargs nutzen kann. Jan