(Bash) Leerzeichen in for-Schleife maskieren

17/11/2012 - 12:56 von Thomas Wildgruber | Report spam
Hi Group,

um mir mal schnell einen Überblick über die Größen einiger Verzeichnisse
anzeigen zu lassen, habe ich das 'du -hs' Kommando in einer for-Schleife
laufen lassen aber bei Verzeichnissen mit Leerzeichen scheitert das
Vorgehen und das maskieren der Leerzeichen mit Gànsefüsschen funktioert
nicht:

snip
$ ls -l
total 0
drwxr-xr-x@ 14 pronto staff 476 4 Sep 2011 DP4Lion.vmwarevm
drwxr-xr-x@ 18 pronto staff 612 1 Nov 11:34 Debian 5.vmwarevm
drwxr-xr-x@ 17 pronto staff 578 4 Sep 2011 Debian 5_3.vmwarevm
drwxr-xr-x@ 42 pronto staff 1428 3 Feb 2012 Debian_6.0.0_GUI.vmwarevm
drwxr-xr-x@ 50 pronto staff 1700 10 Nov 12:05 Debian_6_1.vmwarevm
drwxr-xr-x@ 18 pronto staff 612 17 Nov 12:06 MacOS_Lion_1.vmwarevm
drwxr-xr-x@ 84 pronto staff 2856 1 Sep 13:06 W2K8R2_1.vmwarevm
drwxr-xr-x@ 60 pronto staff 2040 2 Jun 20:35 Windows 7.vmwarevm
drwxr-xr-x@ 122 pronto staff 4148 17 Nov 12:08 Windows XP
Professional.vmwarevm
snap

snip
$ for i in `ls`; do du -hs "$i"; done
9,3G DP4Lion.vmwarevm
du: Debian: No such file or directory
du: 5.vmwarevm: No such file or directory
du: Debian: No such file or directory
du: 5_3.vmwarevm: No such file or directory
5,6G Debian_6.0.0_GUI.vmwarevm
11G Debian_6_1.vmwarevm
14G MacOS_Lion_1.vmwarevm
32G W2K8R2_1.vmwarevm
du: Windows: No such file or directory
du: 7.vmwarevm: No such file or directory
du: Windows: No such file or directory
du: XP: No such file or directory
du: Professional.vmwarevm: No such file or directory
snap

Jetzt habe ich gelesen, dass man den Internal Field Seperator (IFS) zB auf
ein Nemwline-Ziechen () setzen könnte aber das scheint nur in Skripts
oder Shellfunktionen zu funktionieren:

snip
$ foldersize ()

{
IFS=$''
for i in `ls`; do
du -hs $i
done
}


snap

Diese Funktion liefert dann die erwartete Ausgabe:

snip
$ foldersize
9,3G DP4Lion.vmwarevm
2,0G Debian 5.vmwarevm
7,1G Debian 5_3.vmwarevm
5,6G Debian_6.0.0_GUI.vmwarevm
11G Debian_6_1.vmwarevm
14G MacOS_Lion_1.vmwarevm
32G W2K8R2_1.vmwarevm
25G Windows 7.vmwarevm
50G Windows XP Professional.vmwarevm
snap

Jetzt habe ich aber das a) das Problem, dass zumindest in dieser Shell
hinterher meine Umgebungsvariable IFS nicht mehr stimmt, was noch zu
verschmerzen wàre (weil nur für diese Shell gültig) und b) ich es jetzt
nicht hinbekommen habe das Setzen der Umgebungsvariable in meinem Quick and
Dirty Einzeiler Workaround zu integrieren.

Ein Setzen der Umgebungsvariable in einem Einzeiler scheitert:

snip
$ IFS=$'' for i in `ls`; do du -hs "$i"; done
-bash: syntax error near unexpected token `do'
snap

Kann man jetzt in dieser for-Schleife die Leerzeichen irgendwie geschickt
maskieren, so dass das Kommando als Einzeiler ausgeführt werden kann oder
brauche ich die umstàndliche Variante mit Shell-Skript oder -Funktion?

Thx & Bye Tom
"Manches Gewissen ist nur rein, weil es nie benutzt wurde" (Robert Lembke)
 

Lesen sie die antworten

#1 Oliver Sch
18/11/2012 - 00:31 | Warnen spam
Thomas Wildgruber wrote:

um mir mal schnell einen Überblick über die Größen einiger
Verzeichnisse anzeigen zu lassen, habe ich das 'du -hs' Kommando in
einer for-Schleife laufen lassen aber bei Verzeichnissen mit
Leerzeichen scheitert das Vorgehen und das maskieren der Leerzeichen
mit Gànsefüsschen funktioert nicht:



Mach doch einfach mal "du -hs *" oder "du -c -a -h --max-depth=1 ."

Zudem ist xargs dein Freund für kaputte Dateinamen:

find -maxdepth 1 -print0 | xargs -0 du -hs

Übrigens gibt es auch auf der Shell lustige Sachen. Leg mal eine Datei
"-rf" ab. Dann leg dort auch noch ein Verzeichnis an. Und dann mach im
gleichen Verzeichnis ein "rm *". Die Datei "-rf" wirkt als Option für rm
und löscht dann das Verzeichnis mit weg, was es ohne diese Option nicht
getan hàtte.

Die Datei "-rf" wird aber auch nicht mitgelöscht, denn sie wird als
Option erfasst.

Beispiel:

cd $(mktemp -d) # gehe in ein temporàres Verzeichnis
mkdir bla1
mkdir bla2
rm * # gibt fehlermeldung
touch -- "-rf" # Datei "-rf" anlegen
rm * # tut, weil die Datei "-rf" als Option wirkt

mfg
Oli

Man darf ruhig intelligent sein, man muss sich nur zu helfen wissen

Ähnliche fragen