hi,
ich habe eine textdatei die eine liste von dateien erhaelt, zb:
"
/etc/fstab
/etc/passwd
"
wie kann ich nun in einem bash-script die gesamt-groesse beider dateien berechnen?
die dateigroessen sollen in bytes eingelesen, und in kb/mb-werten ausgegeben werden.
wenn zb /etc/fstab 5100bytes, und die /etc/passwd 23453bytes gross waeren, soll das script mir "28kb" ausgeben...
thnxs & gruss,
andre
dateigroessen zusammenaddieren
Re: dateigroessen zusammenaddieren
haette ich ja nicht gedacht, aber die bash kann ja wirklich rechnen:
bash-2.03$ factor 27417
27417: 3 13 19 37
siehe <a href="http://www.tldp.org/LDP/abs/html/mathc.html" target="_blank"><!--auto-->http://www.tldp.org/LDP/abs/html/mathc. ... <!--auto-->
aber der job ist mir zu stressig in bash.
-file oeffnen
-zeilenweises parsen
-die dategroessen ermitteln
-nach kb konvertieren
haste denn kein perl auf der buechse? das koennte ich schneller zusammenhuehnern.
schon mal `man du` gelesen?
ratte
bash-2.03$ factor 27417
27417: 3 13 19 37
siehe <a href="http://www.tldp.org/LDP/abs/html/mathc.html" target="_blank"><!--auto-->http://www.tldp.org/LDP/abs/html/mathc. ... <!--auto-->
aber der job ist mir zu stressig in bash.
-file oeffnen
-zeilenweises parsen
-die dategroessen ermitteln
-nach kb konvertieren
haste denn kein perl auf der buechse? das koennte ich schneller zusammenhuehnern.
schon mal `man du` gelesen?
ratte
Re: dateigroessen zusammenaddieren
TEXTDATEI enthält die liste der files.
for FILE in `cat $TEXTDATEI `; do
#....
done
durchläuft alle einträge der inputdatei
ISIZE=`cat $FILE | wc -c`
ermittelt die zahl der zeichen einer datei (ich glaub die white-spaces werden nicht erfasst -- ggf einen zusätzlichen parameter finden oder ein ganz anderes verfahren wählen, ich denk es gibt mehrere varianten).
aufaddieren der gesamtzahl innerhalb der loop:
TOTALB=$[ TOTALB + ISIZE ]
(TOTALB natürlich vorher initialisieren).
jetzt hast du die zahl in bytes.
jetzt unterscheiden, ob in b/kb/mb (umständlich, weil logarithmusfunktion nicht implementiert ist):
TOTALK=$[ TOTALB / 1024 ]
TOTALM=$[ TOTALK / 1024 ]
jetzt steht in TOTALB/K/M die grösse in byte/KB/MB. wenn TOTALM != 0 gibts du die aus. sonst, wenn TOTALK != 0 die KB, andernfalls die bytes.
# ps: ich weiss nicht was für grosse zahlen in der bash erlaubt sind.
jetzt noch alles zusammenbauen -- und debuggen.
hubert.
for FILE in `cat $TEXTDATEI `; do
#....
done
durchläuft alle einträge der inputdatei
ISIZE=`cat $FILE | wc -c`
ermittelt die zahl der zeichen einer datei (ich glaub die white-spaces werden nicht erfasst -- ggf einen zusätzlichen parameter finden oder ein ganz anderes verfahren wählen, ich denk es gibt mehrere varianten).
aufaddieren der gesamtzahl innerhalb der loop:
TOTALB=$[ TOTALB + ISIZE ]
(TOTALB natürlich vorher initialisieren).
jetzt hast du die zahl in bytes.
jetzt unterscheiden, ob in b/kb/mb (umständlich, weil logarithmusfunktion nicht implementiert ist):
TOTALK=$[ TOTALB / 1024 ]
TOTALM=$[ TOTALK / 1024 ]
jetzt steht in TOTALB/K/M die grösse in byte/KB/MB. wenn TOTALM != 0 gibts du die aus. sonst, wenn TOTALK != 0 die KB, andernfalls die bytes.
# ps: ich weiss nicht was für grosse zahlen in der bash erlaubt sind.
jetzt noch alles zusammenbauen -- und debuggen.
hubert.
Re: dateigroessen zusammenaddieren
ich hab's spasseshalber gleich zusammengebaut:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh
# $1: inputfile
TOTALB=0
for FILE in `cat $1`; do
ISIZE=`cat $FILE | wc --bytes`
echo "$FILE: $ISIZE b"
TOTALB=$[ TOTALB + ISIZE ]
done
TOTALK=$[ TOTALB / 1024 ]
TOTALM=$[ TOTALK / 1024 ]
if [ $TOTALM -ne 0 ]; then
echo "$TOTALM Mb"
elif [ $TOTALK -ne 0 ]; then
echo "$TOTALK Kb"
else
echo "$TOTALB b"
fi
</font><hr></pre></blockquote>
es wird jeweils abgerundet. andernfalls würde es etwas aufwendiger
h.
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh
# $1: inputfile
TOTALB=0
for FILE in `cat $1`; do
ISIZE=`cat $FILE | wc --bytes`
echo "$FILE: $ISIZE b"
TOTALB=$[ TOTALB + ISIZE ]
done
TOTALK=$[ TOTALB / 1024 ]
TOTALM=$[ TOTALK / 1024 ]
if [ $TOTALM -ne 0 ]; then
echo "$TOTALM Mb"
elif [ $TOTALK -ne 0 ]; then
echo "$TOTALK Kb"
else
echo "$TOTALB b"
fi
</font><hr></pre></blockquote>
es wird jeweils abgerundet. andernfalls würde es etwas aufwendiger
h.
Re: dateigroessen zusammenaddieren
hi,
erstmal ein grosses thnxs fuerdie schnelle hilfe <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">
eine nicht zum thema gehoehrende frage haett ich noch <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">...
- wie hast du hier den "code:"-bereich erstellt?
gruss,
andre
erstmal ein grosses thnxs fuerdie schnelle hilfe <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">
eine nicht zum thema gehoehrende frage haett ich noch <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">...
- wie hast du hier den "code:"-bereich erstellt?
gruss,
andre
Re: dateigroessen zusammenaddieren
> eine nicht zum thema gehoehrende frage haett ich noch ...
> - wie hast du hier den "code:"-bereich erstellt?
oben in der fensterleiste gibt es das icon "hilfe". dort sind alle tags erklärt, die du im board benutzen kannst.
hubert
PS:
> es wird jeweils abgerundet. andernfalls würde es etwas aufwendiger
ich hab nun auch noch die änderungen für die nachkommastelle eingebaut (zb "3.2 Kb"). wenns dich interessiert kann ichs posten.
> - wie hast du hier den "code:"-bereich erstellt?
oben in der fensterleiste gibt es das icon "hilfe". dort sind alle tags erklärt, die du im board benutzen kannst.
hubert
PS:
> es wird jeweils abgerundet. andernfalls würde es etwas aufwendiger
ich hab nun auch noch die änderungen für die nachkommastelle eingebaut (zb "3.2 Kb"). wenns dich interessiert kann ichs posten.
Re: dateigroessen zusammenaddieren
hi,
coool, gib her <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
andre
coool, gib her <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
andre
Re: dateigroessen zusammenaddieren
here goes...
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh
# $1: inputfile
SUMBYTE=0
for FILE in `cat $1`; do
ISIZE=`cat $FILE | wc --bytes`
#printf "$FILE: \<!--no-->t\<!--no-->t$ISIZE b\<!--no-->n"
SUMBYTE=$[ SUMBYTE + ISIZE ]
done
#echo "================================================="
#echo "Summe: $SUMBYTE bytes"
SUMKILO=$[ SUMBYTE / 1024 ]
REMKILO=$[ SUMBYTE % 1024 ] # remainder
FRCKILO=$[ 10 * REMKILO / 1024 ] # fraction
SUMMEGA=$[ SUMKILO / 1024 ]
REMMEGA=$[ SUMKILO % 1024 ]
FRCMEGA=$[ 10 * REMMEGA / 1024 ]
if [ $SUMMEGA -ne 0 ]; then
echo "$SUMMEGA.$FRCMEGA Mb"
elif [ $SUMKILO -ne 0 ]; then
echo "$SUMKILO.$FRCKILO Kb"
else
echo "$SUMBYTE b"
fi
</font><hr></pre></blockquote>
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh
# $1: inputfile
SUMBYTE=0
for FILE in `cat $1`; do
ISIZE=`cat $FILE | wc --bytes`
#printf "$FILE: \<!--no-->t\<!--no-->t$ISIZE b\<!--no-->n"
SUMBYTE=$[ SUMBYTE + ISIZE ]
done
#echo "================================================="
#echo "Summe: $SUMBYTE bytes"
SUMKILO=$[ SUMBYTE / 1024 ]
REMKILO=$[ SUMBYTE % 1024 ] # remainder
FRCKILO=$[ 10 * REMKILO / 1024 ] # fraction
SUMMEGA=$[ SUMKILO / 1024 ]
REMMEGA=$[ SUMKILO % 1024 ]
FRCMEGA=$[ 10 * REMMEGA / 1024 ]
if [ $SUMMEGA -ne 0 ]; then
echo "$SUMMEGA.$FRCMEGA Mb"
elif [ $SUMKILO -ne 0 ]; then
echo "$SUMKILO.$FRCKILO Kb"
else
echo "$SUMBYTE b"
fi
</font><hr></pre></blockquote>