Ein Shell-Einzeiler:
for i in */; do echo -ne "$i\tfiles: "; ls -A $i | wc -l | head -c -1 ; echo -ne "\t"; du -hs $i | cut -f1; done
ergibt:
2014-06-12/ files: 15446 1,2G
2014-06-13/ files: 43188 3,3G
[...]
Der Reihe nach:
*/lässt die Shell selbst auf alle Verzeichnisse im aktuellen Unterverzeichnis auflösen. Ausprobieren kann man das mitecho */. Durch das Verwenden genauerer Filter lässt sich nach speziellen Unterverzeichnissen filtern, z.B.2014*/. (Wichtig ist für uns hier nur der "/" am Ende, damit wir nur Verzeichnisse bekommen.)
Die for Schleife läuft für jeden so erhaltenen Wert (gespeichert als$i) durch.echo -neerlaubt Steuersymbole (-e) wie "\t" für Tabulatoren und gibt keine abschließende Leerzeile aus (-n)ls -A $ilistet alle Verzeichnisse und Dateien (auch versteckte Einträge, wie ".secret", aber nicht "." und ".." wie es "-a" tun würde). Hier könnte man die zu zählenden Dateien auch weiter filtern, z.B. mitls -A $i./thumb-0000*jpg 2>/dev/nullalle Dateien die dem gegebenen Muster entsprechen. Wichtig ist hier die Verwendung von "./" und Fehlermeldungen müssen ignoriert werden ("2>/dev/null"), sonst wird unsere Formatierung zerstört. Wenn auf diese Weise Dateien gefiltert werden, wird dieser Filter aber nicht für den Platzbedarf übernommen!wc -lzählt die Zeilen, also die vonlsübergebenen Einträgehead -c -1entfernt das letzte Zeichen - das ist der Zeilenumbruch (damit bleiben wir in der selben Zeile!)echo -ne "\t"formatiert unsere Ausgabe (s.o.)du -hs $ierrechnet den Platzverbrauch des Unterverzeichnisses.
Um hier wie bei der Zählung der Dateien zu filtern muss folgendes statt dessen verwendet werden:ls -A $i./thumb-0000*jpg 2>/dev/null | tr \\n \\0 | du -hc --files0-from=- | tail -n1
Der Output vonls(wie oben) wird mittrkonvertiert (Zeilenumbrüche werden durch \0 ersetzt) undduangewiesen, die zu zählenden Argumente von StdIn zu lesen (--files0-from=-).dugibt jetzt für jede Datei ihre Größe an und Dank-cam Ende der einzelnen Ergebnisse eine totale Summe aus. Das ist das einzige, was uns interessiert, darum verwenden wirtail -n1um diese letzte Zeile zu erhalten.cut -f1gibt uns nur die erste Spalte der Ausgabe vondu
Viel Spaß damit!
- Blog von Peter Schmidt
- 5441 Aufrufe
