Gesamtgröße des Inhalts aller Dateien in einem Verzeichnis [geschlossen]

103

Wenn ich lsoder verwende du, erhalte ich den Speicherplatz, den jede Datei belegt.

Ich benötige die Gesamtsumme aller Daten in Dateien und Unterverzeichnissen, die ich erhalten würde, wenn ich jede Datei öffnen und die Bytes zählen würde. Bonuspunkte, wenn ich diese erhalten kann, ohne jede Datei zu öffnen und zu zählen.

Arthur Ulfeldt
quelle
1
lsZeigt tatsächlich die Anzahl der Bytes in jeder Datei an, nicht die Größe des Speicherplatzes. Reicht das für Ihre Bedürfnisse aus?
Greg Hewgill
3
Beachten Sie, dass dudiese Frage nicht beantwortet werden kann. Es zeigt den Speicherplatz an, den das Verzeichnis auf der Festplatte belegt (die Daten der Dateien plus die Größe der Metainformationen des zusätzlichen Dateisystems). Die duAusgabe kann sogar kleiner sein als die Gesamtgröße aller Dateien. Dies kann passieren, wenn das Dateisystem komprimierte Daten auf der Festplatte speichern kann oder wenn feste Links verwendet werden. Richtige Antworten basieren auf lsund find. Sehen Sie die Antworten von Nelson und bytepan hier oder diese Antwort: unix.stackexchange.com/a/471061/152606
anton_rh

Antworten:

108

Wenn Sie die 'scheinbare Größe' (dh die Anzahl der Bytes in jeder Datei) und nicht die Größe der Dateien auf der Festplatte möchten, verwenden Sie die Option -boder --bytes(wenn Sie ein Linux-System mit GNU- Coreutils haben ):

% du -sbh <directory>
Arkady
quelle
1
funktioniert auf meinen neueren Red Hat Boxen, leider nicht auf meiner eingebetteten Dev Box.
Arthur Ulfeldt
3
Gibt es eine einfache Möglichkeit, die „scheinbare Größe“ in einem für Menschen lesbaren Format anzuzeigen? Bei Verwendung du -shb(wie in dieser Antwort vorgeschlagen) -bscheint die -hEinstellung die Einstellung zu überschreiben .
Mathias Bynens
6
@MathiasBynens Kehrt die Reihenfolge der Flags um (dh du -sbh <dir>). Funktioniert bei mir.
Luis E.
2
@ MathiasBynensdu -sh --apparent-size /dir/
Jongosi
2
@Arkady Ich habe Ihre Lösung unter CentOS und Ubuntu ausprobiert und es gibt einen kleinen Fehler. Du willst "du-sbh". Das "-h" -Flag muss zuletzt kommen.
TheJollySin
46

Verwendung du -sb:

du -sb DIR

Fügen Sie optional die hOption für eine benutzerfreundlichere Ausgabe hinzu:

du -sbh DIR
rauben
quelle
4
-b scheint eine illegale Option für MacOS 'du
lynxoid
3
@lynxoid: Sie können die GNU-Version mit Brew installieren : brew install coreutils. Es wird als Befehl verfügbar sein gdu.
Neu242
1
Funktioniert nicht. ls-> file.gz hardlink-to-file.gz. stat -c %s file.gz-> 9657212. stat -c %s hardlink-to-file.gz-> 9657212. du -sb-> 9661308. Es ist definitiv nicht die Gesamtgröße des Inhalts, sondern die Größe, die das Verzeichnis auf der Festplatte einnimmt.
anton_rh
24

CD ins Verzeichnis, dann:

du -sh

ftw!

Ursprünglich schrieb hier darüber: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/

AO_
quelle
1
Das ist einfach und funktioniert! Vielen Dank. Manchmal möchte ich die -LOption hinzufügen, damit duSymlinks folgen.
Conradkleinespel
2
funktioniert für mich (unter OS X)
Sam Boosalis
2
Das ist einfach und funktioniert nicht. Es gibt den Speicherplatz aus, den das Verzeichnis auf der Festplatte belegt, und nicht die Gesamtgröße des Inhalts, der durch Öffnen jeder Datei und Zählen der Bytes berechnet werden kann.
anton_rh
17

Nur eine Alternative:

ls -lAR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'

grep -v '^d' schließt die Verzeichnisse aus.

Barun
quelle
4
Perfekt, fügen Sie auch den Parameter -a hinzu, um "versteckte Dateien" zu erhalten (alles, was mit einem Punkt beginnt)
Nicholi
Auf einen bestimmten Dateityp (in diesem Fall PNG) isoliert und zur besseren Lesbarkeit in MB ausgedrückt: ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
MusikPolice
Es ist eine richtige Antwort. Im Gegensatz zu dudieser Lösung zählt die Gesamtgröße aller Daten in Dateien wirklich so, als ob sie einzeln geöffnet und ihre Bytes gezählt würden. Aber ja, das Hinzufügen des -AParameters ist erforderlich, um auch versteckte Dateien zu zählen.
anton_rh
13

Das "% s" -Format von stat gibt die tatsächliche Anzahl von Bytes in einer Datei an.

 find . -type f |
 xargs stat --format=%s |
 awk '{s+=$1} END {print s}'

Fühlen Sie sich frei, Ihre Lieblingsmethode zum Summieren von Zahlen zu ersetzen .

Nelson
quelle
4
Verwenden Sie vorzugsweise "find. -Type f -print0 | xargs -0 ...", um Probleme mit bestimmten Dateinamen (mit Leerzeichen usw.) zu vermeiden.
Hlovdal
1
Ja, guter Punkt. wenn es nicht in bsd 4.2 war, erinnere ich mich nicht daran, es zu benutzen :-(
Nelson
3
find -print0und xargs -0werden für Dateinamen mit Leerzeichen benötigt. OS X will stat -f %z.
Kornel
1
(Beachten Sie, dass stat mit spärlichen Dateien arbeitet und die große Nenngröße der Datei und nicht die kleineren Blöcke angibt, die auf festplattenähnlichen duBerichten verwendet werden.)
Nelson
1
Im Gegensatz zu vielen anderen Antworten, bei denen das duDienstprogramm fälschlicherweise verwendet wird , ist diese Antwort korrekt. Die Antwort hier ist sehr ähnlich: unix.stackexchange.com/a/471061/152606 . Aber ich würde ! -type dstattdessen auch verwenden, -type fum Symlinks zu zählen (die Größe des Symlinks selbst (normalerweise wenige Bytes), nicht die Größe der Datei, auf die es zeigt).
anton_rh
3

Wenn Sie das "du" der Busybox in einem eingebetteten System verwenden, können Sie mit du keine genauen Bytes erhalten, sondern nur Kbytes, die Sie erhalten können.

BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary

Usage: du [-aHLdclsxhmk] [FILE]...

Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.

Options:
        -a      Show sizes of files in addition to directories
        -H      Follow symbolic links that are FILE command line args
        -L      Follow all symbolic links encountered
        -d N    Limit output to directories (and files with -a) of depth < N
        -c      Output a grand total
        -l      Count sizes many times if hard linked
        -s      Display only a total for each argument
        -x      Skip directories on different filesystems
        -h      Print sizes in human readable format (e.g., 1K 243M 2G )
        -m      Print sizes in megabytes
        -k      Print sizes in kilobytes(default)
Sam Liao
quelle
3

Wenn ein Ordner erstellt wird, weisen viele Linux-Dateisysteme 4096 Byte zu, um einige Metadaten über das Verzeichnis selbst zu speichern. Dieser Speicherplatz wird um ein Vielfaches von 4096 Bytes erhöht, wenn das Verzeichnis wächst.

Der Befehl du (mit oder ohne Option -b) berücksichtigt dieses Leerzeichen , wie Sie sehen können, wenn Sie Folgendes eingeben:

mkdir test && du -b test

Sie haben ein Ergebnis von 4096 Bytes für ein leeres Verzeichnis. Wenn Sie also 2 Dateien mit 10000 Bytes in das Verzeichnis einfügen , beträgt die von du -sb angegebene Gesamtmenge 24096 Bytes.

Wenn Sie die Frage sorgfältig lesen, ist dies nicht die Frage. Der Fragesteller fragte:

Die Gesamtsumme aller Daten in Dateien und Unterverzeichnissen, die ich erhalten würde, wenn ich jede Datei öffnen und die Bytes zählen würde

dass im obigen Beispiel 20000 Bytes sein sollten, nicht 24096.

Die richtige Antwort IMHO könnte also eine Mischung aus Nelson- Antwort und einem Vorschlag sein, mit Dateinamen umzugehen , die Leerzeichen enthalten:

find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'
Bytepan
quelle
2

Es gibt mindestens drei Möglichkeiten, um die "Gesamtsumme aller Daten in Dateien und Unterverzeichnissen" in Bytes zu ermitteln, die sowohl unter Linux / Unix als auch unter Git Bash für Windows funktionieren. Diese sind in der Reihenfolge vom schnellsten zum langsamsten im Durchschnitt aufgeführt. Zu Ihrer docrootInformation wurden sie im Stammverzeichnis eines ziemlich tiefen Dateisystems ausgeführt ( in einer Magento 2 Enterprise-Installation mit 71.158 Dateien in 30.027 Verzeichnissen).

1.

$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes

real    0m0.221s
user    0m0.068s
sys     0m0.160s

2.

$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes

real    0m0.256s
user    0m0.164s
sys     0m0.196s

3.

$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes

real    0m0.553s
user    0m0.308s
sys     0m0.416s


Diese beiden funktionieren auch, basieren jedoch auf Befehlen, die in Git Bash für Windows nicht vorhanden sind:

1.

$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes

real    0m0.233s
user    0m0.116s
sys     0m0.176s

2.

$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes

real    0m0.242s
user    0m0.104s
sys     0m0.152s


Wenn Sie nur die Summe für das aktuelle Verzeichnis möchten, fügen Sie dann -maxdepth 1zu find.


Beachten Sie, dass einige der vorgeschlagenen Lösungen keine genauen Ergebnisse liefern, daher würde ich mich stattdessen an die obigen Lösungen halten.

$ du -sbh
832M    .

$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
Total: 583772525

$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471

$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Total 968133
thdoan
quelle
1
In Bezug auf Git Bash für Windows ist - im Fall von Cygwin - dcein Teil des bcPakets. Umdc es zu erhalten , muss es installiert werden bc.
Ruvim
1

Für Win32 DOS können Sie:

c:> dir / sc: \ Verzeichnis \ du \ willst

und die vorletzte Zeile gibt an, wie viele Bytes die Dateien belegen.

Ich weiß, dass dies alle Dateien und Verzeichnisse liest, aber in einigen Situationen schneller funktioniert.

Sonne
quelle
1

duist praktisch, aber findnützlich, wenn Sie nur die Größe einiger Dateien berechnen möchten (z. B. Filter nach Erweiterung verwenden). Beachten Sie auch, dass sie findselbst die Größe jeder Datei in Bytes drucken können. Um eine Gesamtgröße zu berechnen, können wir den dcBefehl auf folgende Weise verbinden:

find . -type f -printf "%s + " | dc -e0 -f- -ep

Hier findwird eine Folge von Befehlen für dclike generiert 123 + 456 + 11 +. Das abgeschlossene Programm sollte jedoch wie 0 123 + 456 + 11 + pfolgt aussehen (Postfix-Notation beachten ).

Um das fertige Programm zu erhalten, müssen wir 0vor dem Ausführen der Sequenz von stdin auf den Stapel legen und nach der Ausführung die oberste Nummer drucken (der pBefehl am Ende). Wir erreichen es durch dcOptionen:

  1. -e0ist nur eine Abkürzung dafür -e '0', die 0auf den Stapel legt ,
  2. -f-ist zum Lesen und Ausführen von Befehlen von stdin (das von findhier erzeugte ),
  3. -epdient zum Drucken des Ergebnisses ( -e 'p').

Um die Größe in MiB zu drucken, wie 284.06 MiBwir sie -e '2 k 1024 / 1024 / n [ MiB] p'stattdessen in Punkt 3 verwenden können (die meisten Leerzeichen sind optional).

Ruvim
quelle
1

Dies kann helfen:

ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'

Mit dem obigen Befehl werden alle Dateien summiert, die die Verzeichnisgröße verlassen.

Ataul Haque
quelle
1
Beachten Sie, dass diese Lösung der Antwort von Barun sehr ähnlich ist . Diese Lösung summiert jedoch keine Dateien in Unterverzeichnissen.
Ruvim
1
@ruvim, es summiert auch keine versteckten Dateien. Um versteckte Dateien zusammenzufassen, -Amuss die Option hinzugefügt werden ls.
anton_rh
0

Verwenden:

$ du -ckx <DIR> | grep total | awk '{print $1}'

Dabei ist <DIR> das Verzeichnis, das Sie überprüfen möchten.

Das '-c' gibt Ihnen Gesamtsummen-Daten an, die mit dem Teil 'grep total' des Befehls extrahiert werden, und die Anzahl in KB wird mit dem Befehl awk extrahiert.

Die einzige Einschränkung hier ist, wenn Sie ein Unterverzeichnis haben, das den Text "total" enthält, wird es ebenfalls ausgespuckt.

Rob Jones
quelle