• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

Shell-Skript: Dateigröße herausfinden

konstantin

Well-Known Member
Themenstarter #1
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
 

tigion

goodnight moon
#8
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 :)
 
#9
konstantin hat gesagt.:
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:

Tron

Well-Known Member
#11
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}'
 

GaTh3N

Well-Known Member
#13
Tron hat gesagt.:
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 :)
 

0815Chaot

FreeBSD/sparc64-Tüftler
#16
GaTh3N hat gesagt.:
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).
 

Tron

Well-Known Member
#17
GaTh3N hat gesagt.:
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>
 

Tron

Well-Known Member
#18
kili hat gesagt.:
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.
 
#19
Tron hat gesagt.:
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.)
 

GaTh3N

Well-Known Member
#20
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:
 

Tron

Well-Known Member
#21
GaTh3N hat gesagt.:
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".