TEILEN

Ich stand vorhin vor der Aufgabe herauszufinden, wie viel Speicherplatz sämtliche JPG-Bilder und MOV-Videos in einer weit und tief verzweigten Ordnerstruktur mit unzähligen Dateien ganz unterschiedlichen Typs belegen. Die klassischen Befehle Du, Df und Co. helfen hier auf den ersten Blick nicht direkt weiter, da ich eben rekursiv den Speicherplatz dieser beiden Dateitypen ermitteln möchte.

Die Aufgabe war letztendlich gar nicht so einfach zu lösen: Mit find fische ich mir rekursiv sämtliche Dateien eines Typs aus den Unterverzeichnissen, du ermittelt daraufhin die Dateigröße jeder Datei. Danach schnippel ich mir mit tail -1 die am Anfang stehende Dateigröße aus der Ausgabe und addiere dann mit awk Zeile für Zeile der Ausgabe zusammen. Kommt ihr auf eine bessere, weil schlankere Lösung? Mich würde das mal interessieren.

$ find . -type f -name "*.JPG" -exec du -shc {} + | tail -1 | awk '{print $1}'
9,8G
$ find . -type f -name "*.MOV" -exec du -shc {} + | tail -1 | awk '{print $1}'
15G

Wer solch eine Aufgabe öfters einmal zu bewältigen hat, der kann sich das Kommando beispielsweise als Alias in die .bashrc eintragen, so muss man es nicht immer komplett neu eintippen oder aus der History herausfischen. Alternativ könnt ihr euch aber auch einmal das kleines Perl-Skript duext ansehen. Es rechnet nicht nur die Dateigrößen eines Dateityps zusammen, sondern listet die rekursiv zusammengerechnete Belegung jedes in den Unterverzeichnissen vorkommenden Dateityps inklusive der Anzahl der Datein auf.

## duext herunterladen, umbenennen und ausführbar machen
$ wget https://sites.google.com/site/mailvortex/unix-and-linux/duext/duext.pl.txt
$ mv duext.pl.txt duext
$ chmod +x duext

## duext beispielsweise auf das Homeverzeichnis loslassen
$ ./duext /home/beispiel
soh: 2 files, 7409 bytes
cmeta: 4 files, 52 bytes
png: 12112 files, 791262261 bytes
...
gpg: 3 files, 40 bytes
ots: 1 files, 19030 bytes
odt: 7 files, 226643 bytes
/////// 336 unique file extensions
/////// total 57098 files, 65985706195 bytes

## Nur die Belegung von JPG- und PNG-Dateien ausgeben
$ ./duext /home/beispiel | grep -E 'jpg|png'
png: 12114 files, 791559846 bytes
jpg: 2199 files, 5751992470 bytes
Anzeige

3 KOMMENTARE

  1. Sehr coole Lösung.
    Hab es grad eine Viertelstunde versucht mit ncdu zu lösen.

    Die --exclude Syntax erlaubt das entfernen von bestimmten Dateitypen. Leider hab ich es nicht hinbekommen, alles ausser *.jpg zu entfernen. Die Regex Syntax erlaubt leider keine negativen lookaheads.

    Danke für die tollen Blogartikel!

    Gruß @it_supertramp

  2. Nach ein bisschen googeln 😉 finde ich folgende Lösung recht elegant:

    $ find . -type f -iname '*.JPG' -print0 | du -ch --files0-from=- | tail -1
    $ find . -type f -iname '*.MOV' -print0 | du -ch --files0-from=- | tail -1

HINTERLASSEN SIE EINE ANTWORT