Wie erhalte ich die tatsächliche Verzeichnisgröße mithilfe von UNIX / Linux-Standardtools?
Alternative Frage: Wie bekomme ich mich mir die aktuelle Verzeichnis Größe zu zeigen (nicht Festplattennutzung)?
Da Leute unterschiedliche Definitionen des Begriffs "Größe" zu haben scheinen: Meine Definition von "Verzeichnisgröße" ist die Summe aller regulären Dateien in diesem Verzeichnis.
Es ist mir egal, wie groß das Verzeichnis inode ist oder wie groß die Dateien auf dem jeweiligen Dateisystem sind (Blöcke * Blockgröße). Ein Verzeichnis mit 3 Dateien zu je 1 Byte hat eine Verzeichnisgröße von 3 Byte (nach meiner Definition).
Die Berechnung der Verzeichnisgröße mit du scheint unzuverlässig zu sein.
Zum Beispiel mkdir foo && du -b foo
meldet "4096 foo", 4096 Bytes anstelle von 0 Bytes. Bei sehr großen Verzeichnissen kann die von gemeldete Verzeichnisgröße du -hs
um 100 GB (!) Und mehr (komprimiertes Dateisystem) abweichen.
Also, was (Tool / Option) muss verwendet werden, um die tatsächliche Verzeichnisgröße zu erhalten?
xfs
zufällig?Antworten:
Hier ist ein Skript, das eine für Menschen lesbare Verzeichnisgröße mit Unix-Standardtools (POSIX) anzeigt.
z.B:
quelle
ls
hier Anrufungen:-q
. Ohne diese Option bricht das Skript ab, wenn ein Dateiname Zeilenumbrüche enthält. Es ist zu schwierig, wirklich zuverlässige Shell-Skripte zu schreiben…Einige Versionen
du
unterstützen das Argument--apparent-size
, dass die scheinbare Größe anstelle der Datenträgernutzung angezeigt wird. Ihr Befehl wäre also:Aus den in Ubuntu 12.04 LTS enthaltenen Manpages für du:
quelle
Nur eine Alternative mit
ls
:ls -nR
:-n
wie-l
, aber numerische UIDs und GIDs auflisten und-R
Unterverzeichnisse rekursiv auflisten .grep -v:
Invertieren Sie den Übereinstimmungssinn, um nicht übereinstimmende Linien auszuwählen. (-v wird von POSIX angegeben.)'^ d'
schließt die Verzeichnisse aus.Ls-Befehl: http://linux.about.com/od/commands/l/blcmdl1_ls.htm
Man Grep: http://linux.die.net/man/1/grep
EDIT :
Bearbeitet als Vorschlag @ Sergey Vlasov.
quelle
-n
Option fürls
statt-l
(show UID / GID - Nummern statt Namen) ist sicherer, weil Benutzer- und Gruppennamen Leerzeichen enthalten können (zB wennwinbind
odersssd
verwendet wird , um das System zu einer Windows - Domäne beitreten, können Sie Gruppennamen erhalten wiedomain users
) . Es sollte auch schneller sein, da Benutzer- und Gruppennamen nicht gesucht werden müssen.Angenommen, Sie haben
du
GNU coreutils, dann sollte dieser Befehl die scheinbare Gesamtgröße einer beliebigen Anzahl von regulären Dateien in einem Verzeichnis berechnen, ohne die Anzahl der Dateien zu beschränken:Fügen Sie die
-l
Option hinzu,du
wenn einige fest verknüpfte Dateien enthalten sind und Sie jeden Hardlink separat zählen möchten (standardmäßig werdendu
mehrere Hardlinks nur einmal gezählt).Der wichtigste Unterschied zu plain
du -sb
ist, dass recursivedu
auch die Größe von Verzeichnissen zählt, die von verschiedenen Dateisystemen unterschiedlich gemeldet werden. Um dies zu vermeiden, wird derfind
Befehl verwendet, um nur reguläre Dateien an zu übergebendu
. Ein weiterer Unterschied besteht darin, dass Symlinks ignoriert werden (wenn sie gezählt werden sollen, muss derfind
Befehl angepasst werden).Dieser Befehl wird verbrauchen auch mehr Speichers als schlicht
du -sb
, weil die Verwendung von--files0-from=FILE
Markendu
Speicher Gerät und Inode - Nummern von allen bearbeiteten Dateien, wie auf das Standardverhalten gegenüber von nur Dateien mit mehr als einem harten Link zu erinnern. (Dies ist kein Problem, wenn die-l
Option zum mehrmaligen Zählen von Hardlinks verwendet wird, da der einzige Grund zum Speichern von Geräte- und Inode-Nummern darin besteht, bereits verarbeitete Hardlink-Dateien zu überspringen.)Wenn Sie eine lesbare Darstellung der Gesamtgröße erhalten möchten, fügen Sie einfach die
-h
Option hinzu (dies funktioniert, weildu
nur einmal aufgerufen wird und die Gesamtgröße selbst berechnet wird, im Gegensatz zu einigen anderen vorgeschlagenen Antworten):oder (wenn Sie befürchten, dass einige Effekte von
-b
dann überschrieben werden-h
)quelle
-b
dies wahrscheinlich durch ersetzt werden könnte-A -B 1
, gibt es kein Äquivalent für--files0-from=-
und für die Verwendungxargs
sind einige Problemumgehungen erforderlich, falls die Dateiliste größer ist alsARG_MAX
(und eine externe Lösung für vom Menschen lesbare Ausgaben).Wenn alles, was Sie wollen, die Größe der Dateien ist, mit Ausnahme des Speicherplatzes, den die Verzeichnisse belegen, können Sie so etwas tun
@ SergeyVlasov wies darauf hin, dass dies fehlschlagen wird, wenn Sie mehr Dateien als haben
argmax
. Um dies zu vermeiden, können Sie Folgendes verwenden:quelle
xargs
wird erdu
mehrmals aufgerufen und jeder Aufruf gibt die Gesamtsumme nur für seinen Teil aus In der gesamten Dateiliste wird danntail
nur die Gesamtgröße des letzten Teils angezeigt.