Shell-Skript: Dateigröße herausfinden

konstantin

Well-Known Member
Hi!

Ich würde gerne in einem Shell-Skript die Dateigröße herausfinden.

Hatte mir da folgendes gedacht:

Code:
ls -l file | cut -f 5

Aber anscheinend ist die Ausgabe nicht durch tab getrennt. Wenn man nun mit -d " " die Leerzeichen als Trennzeichen nutzt, dann geht das auch nicht, da es von Datei zu Datei variiert, wie viele Leerzeichen zwischen den Spalten sind (Je nachdem, wie lang die Werte in den Spalten sind.

Wie kann ich nun herausfinden, wie groß eine Datei ist?

Konstantin
 
oder mal so mit sed ;)

ls -l file | sed -e 's/ [ ]*/ /g' | cut -d ' ' -f 5

aber die Lösung mit awk ist wohl die optimalste bis jetzt :)
 
konstantin schrieb:
Wie kann ich nun herausfinden, wie groß eine Datei ist?

Konstantin


awk und sed sind ja ganz cool, aber wieso so kompliziert?

netbsd% du -h etc.tar.bz2
224K etc.tar.bz2

Das erledigt doch alles du.

Edit:
Sorry, du wolltest ja nur die Dateigröße, der Name erscheint ja auch dabei.

netbsd% du -h etc.tar.bz2 | awk '{print $1}'
224K

Dann müsstest du es nochmal durch awk pipen, aber ist dann im endeffekt das gleiche...
 
Zuletzt bearbeitet:
Achtung: du gibt NICHT zwangsläufig die Dateigröße! Sogar eher in den seltensten Fällen.
du liefert den Platz, den die Blöcke auf der Platte benötigen. Siehe hierzu man du.

Ein recht einfacher Weg zur Bestimmung der Dateigröße ist:
wc -c $DATEI | awk '{print $1}'
 
Tron schrieb:
Achtung: du gibt NICHT zwangsläufig die Dateigröße! Sogar eher in den seltensten Fällen.
du liefert den Platz, den die Blöcke auf der Platte benötigen. Siehe hierzu man du.

Das stimmt, deswegen sollte man ja auch
Code:
# du -[B]h[/B]
benutzen so wie [moR-pH-euS] es korrekt geschrieben hat :)
 
GaTh3N schrieb:
Das stimmt, deswegen sollte man ja auch
Code:
# du -[B]h[/B]
benutzen so wie [moR-pH-euS] es korrekt geschrieben hat :)
Nein! Der Schalter -h ändert nichts daran, daß du(1) eben einfach nicht die Dateigröße liefert. Nichts anderes sagt auch die Manpage, auf die dich Tron schon hingewiesen hat. du == disk usage != file size.

Wer die Dateigröße korrekt zurechtfrickeln will, nimmt dazu ls(1) | awk(1). Alle anderen benutzen einfach stat(1).
 
GaTh3N schrieb:
Das stimmt, deswegen sollte man ja auch
Code:
# du -[B]h[/B]
benutzen so wie [moR-pH-euS] es korrekt geschrieben hat :)

-h ändert nichts daran, was du misst, sondern nur die Form der Ausgabe.
Aus der manpage:

-h "Human-readable" output. Use unit suffixes: Byte, Kilobyte,
Megabyte, Gigabyte, Terabyte and Petabyte.

<edit>Mist, nicht gesehen, dass es eine 2te Seite gab, auf der das schon beantwortet wurde</edit>
 
kili schrieb:
stat(1) existiert.
Das Problem an stat ist, dass es nicht standardisiert ist (ist, wenn ich mich richtig erinnere, ein Linuxismus). Also wenn das Skript portabel sein soll, dann ist stat eine schlechte Wahl. Das ist zwar hier vermutlich nicht der Fall, wollte ich aber nur angemerkt haben.
 
Tron schrieb:
Das Problem an stat ist, dass es nicht standardisiert ist (ist, wenn ich mich richtig erinnere, ein Linuxismus). Also wenn das Skript portabel sein soll, dann ist stat eine schlechte Wahl. Das ist zwar hier vermutlich nicht der Fall, wollte ich aber nur angemerkt haben.
Da werfen wir doch mal einen Blick ins Manual: http://netbsd.gw.com/cgi-bin/man-cgi?stat

MacOS X hat stat auch dabei.

Aber Tron hat recht, es ist nicht auf allen Systemen. Bei OpenBSD ist es erst seit 3.8 dabei, wenn man den Manpages vertraut.

Ciao

Der Kawana

P.S: http://www.freebsd.org/cgi/man.cgi?query=stat (FreeBSD kennt es auch: The stat utility appeared in NetBSD 1.6 and FreeBSD 4.10.)
 
Tron und 0815Chaot
Stimm, ihr habt vollkomen recht, wenn eine Datei nur einige KByte groß ist, ist die Anzeige von
Code:
du -h
abweichend von
Code:
ls -l
Sorry kann man-Pages selber nicht richtig lesen :ugly:
 
GaTh3N schrieb:
Tron und 0815Chaot
Stimm, ihr habt vollkomen recht, wenn eine Datei nur einige KByte groß ist, ist die Anzeige von
Code:
du -h
abweichend von
Code:
ls -l
Sorry kann man-Pages selber nicht richtig lesen :ugly:
Das beschränkt sich nicht nur auf kleine Dateien:
Code:
%ls -lh datei
-rw-r--r--  1 tron  users   128T 31 Dez 11:53 datei
%du -h datei
 64K    datei
Ja, diese Datei der Länge 128_Tera_Byte verbraucht gerade mal schlappe 64k auf meiner Platte.

So wird's gemacht: (Wenn truncate nicht verfügbar, dann dd mit dem Parameter seek verwenden)
Code:
truncate -s 131072G datei
Der Spaß nennt sich "sparse file".
 
Zurück
Oben