Angenommen, es gibt ein Bildspeicherverzeichnis, sagen wir ./photos/john_doe
, in dem sich mehrere Unterverzeichnisse befinden, in denen sich viele bestimmte Dateien befinden (sagen wir *.jpg
). Wie kann ich eine Gesamtgröße dieser Dateien unterhalb des john_doe
Zweigs berechnen?
Ich habe es versucht du -hs ./photos/john_doe/*/*.jpg
, aber hier werden nur einzelne Dateien angezeigt. Außerdem wird hier nur die erste Verschachtelungsebene des john_doe
Verzeichnisses verfolgt, wie auch john_doe/june/
, aber es wird übersprungen john_doe/june/outrageous/
.
Wie kann ich also den gesamten Zweig durchlaufen und die Größe bestimmter Dateien zusammenfassen?
Antwort1
find ./photos/john_doe -type f -name '*.jpg' -exec du -ch {} + | grep total$
Wenn aufgrund einer sehr langen Dateiliste mehr als ein Aufruf du
erforderlich ist, werden mehrere Gesamtsummen gemeldet und müssen summiert werden.
Antwort2
du -ch public_html/images/*.jpg | grep total
20M total
gibt mir die Gesamtnutzung meiner .jpg
Dateien in diesem Verzeichnis.
Um mit mehreren Verzeichnissen umgehen zu können, müssten Sie dies wahrscheinlich find
irgendwie kombinieren.
Vielleicht finden SieBeispiele für den Befehl „du“nützlich (es beinhaltet auch find
)
Antwort3
In erster Linie benötigen Sie zwei Dinge:
- die
-c
Optiondu
, ihm mitzuteilen, dass eine Gesamtsumme ermittelt werden soll; - entweder
**
(Aktivierungsanleitung) oderfind
(Beispiel) oder zum Durchsuchen von Unterverzeichnissen.
du -ch -- **/*.jpg | tail -n 1
Antwort4
Die bisherigen Antworten berücksichtigen nicht, dass die von find an du übergebene Dateiliste so lang sein kann, dass find die Liste automatisch in Abschnitte aufteilt, was zu mehreren Vorkommen von führt total
.
Sie können entweder grep total
(Gebietsschema!) manuell auswählen und zusammenfassen oder einen anderen Befehl verwenden. Soweit ich weiß, gibt es nur zwei Möglichkeiten, die Gesamtsumme (in Kilobyte) aller von find gefundenen Dateien zu erhalten:
find . -type f -iname '*.jpg' -print0 | xargs -r0 du -a| awk '{sum+=$1} END {print sum}'
Erklärung
find . -type f -iname '*.jpg' -print0
: Findet alle Dateien mit der Endung jpg, unabhängig von Groß- und Kleinschreibung (also *.jpg, *.JPG, *.Jpg...) und gebt sie aus (nullterminiert).
xargs -r0 du -a
: -r: Xargs würde den Befehl auch ohne übergebene Argumente aufrufen, was -r verhindert. -0 bedeutet nullterminierte Strings (nicht durch Zeilenumbruch terminiert).
awk '{sum+=$1} END {print sum}'
: Summiert die vom vorigen Befehl ausgegebenen Dateigrößen
Und als Referenz: Der andere Weg wäre
find . -type f -iname '*.jpg' -print0 | du -c --files0-from=-