shell: Größenvergleich von Dateien

Post Reply
Message
Author
rudi

shell: Größenvergleich von Dateien

#1 Post by rudi »

Hallo,

ich versuche, in einem sh (nicht bash) Skript die Größe einer Datei herauszufinden:

if [ "`du -k ${DATEI}`" > "1000" ]; then do something; done

Klappt nicht, liefert immer wahr zurück. Auch wenn $DATEI kleiner als 1000K ist. Benutze ich statt ">" "-gt", gibt es einen Fehler, ebenso wenn ich die Anführungszeichen weglasse. $DATEI enthält grundsätzlich keine Leerzeichen.

Ein:

if [ "expr `du -k test` > 1000" ]; then do something; fi

klappt auch nicht. Liefert auch immer wahr zurück. Ohne Anführungszeichen gibt es zur Abwechslung einen Fehler.

Wo ist der Haken ?

Jochen

Re: shell: Größenvergleich von Dateien

#2 Post by Jochen »

Benutze doch nächstes Mal das "Programmieren - Allgemein"-Forum für solche Fragen: <a href="http://www.pl-forum.de/cgi-bin/UltraBoa ... =&Session=" target="_blank"><!--auto-->http://www.pl-forum.de/cgi-bin/UltraBoa ... <!--auto-->

1. Schau Dir doch mal die Ausgabe von "du -k /etc/passwd" an. Das sieht ungefähr so aus:<pre>2 /etc/passwd</pre>Genau diese Ausgabe wird von der Shell dort eingesetzt, wo das du-Kommando in Backticks steht. Beim Grössenvergleich kann man mit dem Text "/etc/passwd" aber nix anfangen...

2. Die eckigen Klammern nach dem if sind eine Kurzschreibweise für das test-Kommando. Mit ">" zum numerischen Vergleich kann test nicht umgehen, es muss schon "-gt" für "greater than" sein. Der Fehler, den Du zurückbekommst, liegt an dem "/etc/passwd", das du u.a. ausgibt.

3. Wenn Du nun ">" verwendest, meint die Shell, Du möchtest eine Dateiausgabeumlenkung machen. Schau mal in das Verzeichnis, in dem Du arbeitest, da findest Du eine Datei mit Namen "1000".

4. Die Kombination von test ([) und expr kann nicht funktionieren, da hier "expr" nicht mehr als Kommando, sondern als erstes Argument zu "[", also test, interpretiert wird.

Das if-Statement könnte so aussehen:<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
SIZE_KB=`du -k "$DATEI" | cut -f 1`
if [ $SIZE_KB -gt 1000 ] ; then
do_something
else
do_something_else
fi
</font><hr></pre></blockquote>
Das kann man natürlich auch ohne Variable SIZE_KB machen, aber nach meinem persönlichen Geschmack wird's dann zu unübersichtlich.

Jochen

User avatar
max
Posts: 806
Joined: 14. May 2000 12:55
Location: Ruhrpott

Re: shell: Größenvergleich von Dateien

#3 Post by max »

ein fehlendes Leerzeichen nach der [ (und vor der ])

Sonst interpretiert er das doch als ein Argument.
Hoffe geholfen zu haben
Max

rudi

Re: shell: Größenvergleich von Dateien

#4 Post by rudi »

Erstmal vielen Dank für eure Hilfe und in der Tat, den Dateinamen bei "du -k" hätte ich bemerken müssen.

Was nebensächlich ist, aber trotzdem ein Rätsel: wenn ich bei cut als Trennzeichen (-d) " " eingebe, klappt es nicht - vermutlich weil die Ausgabe ein TAB ist. Aber wie gebe ich cut einen TAB als Trennzeichen mit (z.B. cut aus ifconfig | grep inet klappt gar nicht).


P.S.: Ich hätte nicht gedacht, das grundlegende Fragen zur sh schon als programmieren gilt, werde es aber naürlich das nächste mal berücksichtigen.

Jochen

Re: shell: Größenvergleich von Dateien

#5 Post by Jochen »

Tab als Trennzeichen ist der Default bei cut, daher -d einfach weglassen. <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Bei ifconfig ist das Problem nicht Tab/Space, sondern viele Spaces! Jedes einzelne Space gilt als Trennzeichen. Wenn also eine Zeile durch 8 Spaces am Anfang eingerückt wird, ergibt erst ein <pre>cut -d' ' -f 9</pre> das erwünschte Ergebnis.

Man kann sich in so einem Fall mit "tr -s" und sed behelfen, aber einfacher ist es dann, awk zu verwenden: <pre>awk '{print $1}'</pre> gibt das erste Feld aus, mehrere Blanks & Tabs werden als ein einzelner Feldtrenner betrachtet.

Jochen

marcdevil

Re: shell: Größenvergleich von Dateien

#6 Post by marcdevil »

hallo, also wenns nur darum geht etwas mit dateien > 1000 bytes zu machen, dann geht das auch mit find.
find ./ -type f -size +1000c -exec something {} \<!--no-->;

Post Reply