du akzeptiert keine Variablen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
speefak
Beiträge: 449
Registriert: 27.04.2008 13:54:20

du akzeptiert keine Variablen

Beitrag von speefak » 03.01.2019 16:41:32

Ich habe ein Script in dem ich mit "du -sh" verzeichnisgrößen ausgeben möchte. einige unterverzeichnisse sollen jedoch auch ausgelassen werden und da ist genau der knackpunkt :

bei direkter eingabe funktioniert du :

Code: Alles auswählen

du -sh /var/www/nextcloud   --exclude=*/data/speefak_nc/files/##\ Exclude\ from\ Backup\ ##
setze ich nun die Variablen ein streikt du mit jeglicher syntax :

Code: Alles auswählen

du -sh "$ApacheDir/$WebsiteDir $ExcludeDirParameterDu"
du -sh $(echo "$ApacheDir/$WebsiteDir $ExcludeDirParameterDu")
du -sh $(eval $(echo "$ApacheDir/$WebsiteDir $ExcludeDirParameterDu"))
uvm.
gibt es bei du irgendwelche Besonderheiten ? Wie kann ich sonst mit einem befehl oder programm o.g. größenberechnung umsetzen ?

Oder muss ich erst mit du die gesamtgröße berechnen und dann für jeden exclude ordner die größe berechnen und von der gesamtgröße dann abziehen und dann von bytes in KB,MB oder GB umrechnen ?

Benutzeravatar
whisper
Beiträge: 3184
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: du akzeptiert keine Variablen

Beitrag von whisper » 03.01.2019 16:52:16

Folgendes Experiment führt zum Erfolg:

Code: Alles auswählen

ll /tmp/
total 6008
drwxr-xr-x 2 root root    4096 Nov  4 20:49 data
drwxr-xr-x 2 tcat tcat    4096 Nov  3 21:03 hsperfdata_tcat
drwxr-xr-x 2  507 root    4096 Sep 28 15:54 ioncube
-rw-r--r-- 1 root root     255 Nov  4 19:32 ispp_php.ini
-rwxr-xr-x 1 root root    8057 Oct 10 16:26 ispp_scan
-rw-r--r-- 1 root root 4040919 Oct 10 16:26 ispp_scan.tar.gz
-rw-r--r-- 1 root root 2044330 Nov 10 17:31 lnav_0.8.4_amd64.deb
-rw------- 1 root root       0 Nov 10 17:36 lnav.grep.err
drwx------ 3 root root    4096 Dec 31 16:39 systemd-priva-apache2.service-wnL54T
drwx------ 3 root root    4096 Nov  3 19:01 systemd-privadovecot.service-M2SCrK
drwx------ 3 root root    4096 Nov  3 19:01 systemd-haveged.service-yNoYPf
drwxr-xr-x 3 root root    4096 Nov  4 19:31 v53
drwxr-xr-x 3 root root    4096 Nov  4 19:31 v54
drwxr-xr-x 3 root root    4096 Nov  4 19:31 v55
drwxr-xr-x 3 root root    4096 Nov  4 19:31 v56
drwxr-xr-x 3 root root    4096 Nov  4 19:31 v71
-rw-r--r-- 1 root root     229 Dec  1 14:10 x.dat


T="/tmp"
X="--exclude data"

du -hs $(echo $T) $X
37M	/tmp

du -hs $(echo $T)
41M /tmp

im exclude stören * Platzhalter

Benutzeravatar
Tintom
Moderator
Beiträge: 3033
Registriert: 14.04.2006 20:55:15
Wohnort: Göttingen

Re: du akzeptiert keine Variablen

Beitrag von Tintom » 03.01.2019 16:55:33

Bei verschachtelten Variablen helfen geschweifte Klammern enorm weiter.
man bash hat geschrieben:${parameter}
The value of parameter is substituted. The braces are required when parameter is a positional parameter with more than
one digit, or when parameter is followed by a character which is not to be interpreted as part of its name.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: du akzeptiert keine Variablen

Beitrag von tobo » 03.01.2019 16:57:09

Mach mal so:

Code: Alles auswählen

du -sh "$my_path" --exclude="$my_exclude1" --exclude="$my_exclude2"

Benutzeravatar
speefak
Beiträge: 449
Registriert: 27.04.2008 13:54:20

Re: du akzeptiert keine Variablen

Beitrag von speefak » 03.01.2019 17:25:22

wow so schnell gibt hier schon lösungen - ihr seit spitze ;)

ich habe es nun selbst lösen können :

Code: Alles auswählen


ExcludeDir="/data/speefak_nc/files/## Exclude from Backup ##;/data/testuser"

# set exclude proceessing parameter
	SAVEIFS=$IFS
	IFS=";"
	for i in $ExcludeDir;do
		ExcludeDirParameterTar=$(echo "$ExcludeDirParameterTar" " --exclude=\"$WebsiteDir$i\"")
		ExcludeDirParameterDu=$(echo "$ExcludeDirParameterDu" " --exclude="*$(echo $i | sed 's/ /\\ /g')"")
	done
	IFS=$SAVEIFS

	# calculate directory sizes
	GlobalDirSize=$(du -sh $ApacheDir/$WebsiteDir | awk -F ' ' '{print $1}')
	ExcludeDirSize=$(eval "du -sh $(echo "$ApacheDir/$WebsiteDir $ExcludeDirParameterDu")" | awk -F ' ' '{print $1}')
warum das funktioniert ist mir allerdings nicht 100%tig klar.

whisper, funktioniert auch nur wenn keine Leerzeichen im Pfad enthalten sind

tobo, funktioniert ohne leerzeichen im Pfad :

Code: Alles auswählen

du -sh "$my_path" --exclude="$my_exclude1" --exclude="$my_exclude2"
Das Problem sind die Leerzeichen, wären diese nicht vorhanden würde du auch nicht herumzicken ( vorige version ging nur ohne Leerzeichen, bis jmd Verzeichnisse mit Leerzeichen erstellte :oops: )

tar kommt mit den leerzeichen in variablen klar, du irgendwie nicht.

tobo
Beiträge: 1990
Registriert: 10.12.2008 10:51:41

Re: du akzeptiert keine Variablen

Beitrag von tobo » 03.01.2019 20:08:20

speefak hat geschrieben: ↑ zum Beitrag ↑
03.01.2019 17:25:22
tobo, funktioniert ohne leerzeichen im Pfad :

Code: Alles auswählen

du -sh "$my_path" --exclude="$my_exclude1" --exclude="$my_exclude2"
Das Problem sind die Leerzeichen, wären diese nicht vorhanden würde du auch nicht herumzicken
Wenn das Quoting stimmt, dann sollte das auch mit Leerzeichen funktionieren:

Code: Alles auswählen

$ mkdir -p 'd i r'/{a,'b c',d}
$ for i in 'd i r'/*;do dd if=/dev/zero of="$i"/t1 count=1 bs=100;dd if=/dev/zero of="$i"/"t 1" count=1 bs=100;done
...
$ ls -l 'd i r'/*
d i r/a:
total 8
-rw------- 1 tobo tobo 100 Jan  3 19:27 t 1
-rw------- 1 tobo tobo 100 Jan  3 19:27 t1

d i r/b c:
total 8
-rw------- 1 tobo tobo 100 Jan  3 19:27 t 1
-rw------- 1 tobo tobo 100 Jan  3 19:27 t1

d i r/d:
total 8
-rw------- 1 tobo tobo 100 Jan  3 19:27 t 1
-rw------- 1 tobo tobo 100 Jan  3 19:27 t1


$ mypath='d i r'
$ du -ab "$mypath"
100 d i r/d/t 1
100 d i r/d/t1
4296    d i r/d
100 d i r/a/t 1
100 d i r/a/t1
4296    d i r/a
100 d i r/b c/t 1
100 d i r/b c/t1
4296    d i r/b c
16984   d i r


$ myexclude='*/d'
$ du -ab "$mypath" --exclude="$myexclude"
100 d i r/a/t 1
100 d i r/a/t1
4296    d i r/a
100 d i r/b c/t 1
100 d i r/b c/t1
4296    d i r/b c
12688   d i r


$ myexclude1='*/d'
$ myexclude2='*/b c'
$ du -ab "$mypath" --exclude="$myexclude1" --exclude="$myexclude2"
100 d i r/a/t 1
100 d i r/a/t1
4296    d i r/a
8392    d i r

Antworten