Hier gibt es viele Antworten, von denen viele Duplikate sind. Ich sehe drei Trends: Weiterleiten durch einen zweiten Aufruf, Verwenden von kompliziertem Shell- / AWK-Code und Verwenden anderer Sprachen.
Hier ist eine POSIX-kompatible Lösung mit du und awk , die auf jedem System funktionieren sollte.
Ich habe einen etwas anderen Ansatz gewählt, um -x
sicherzustellen, dass wir auf demselben Dateisystem bleiben (ich brauche diesen Vorgang immer nur, wenn ich nur wenig Speicherplatz habe. Warum sollte ich also Dinge aussortieren, die ich in diesen FS-Baum eingebunden oder verschoben habe?) Symlinked Back?) und Anzeige konstanter Einheiten, um das visuelle Parsen zu vereinfachen. In diesem Fall entscheide ich mich normalerweise, nicht zu sortieren, um die hierarchische Struktur besser erkennen zu können.
sudo du -x | awk '
$1 > 2^20 { s=$1; $1=""; printf "%7sG%s\n", sprintf("%.2f",s/2^21), $0 }'
(Da diese Einheit konsistent ist, können Sie sie anhängen, | sort -n
wenn Sie wirklich sortierte Ergebnisse wünschen .)
Dadurch werden alle Verzeichnisse herausgefiltert, deren (kumulativer) Inhalt 512 MB nicht überschreitet, und anschließend werden Größen in Gigabyte angezeigt. Standardmäßig verwendet du eine Blockgröße von 512 Byte (daher beträgt der awk-Zustand von 2 20 Blöcken 512 MB, und sein 2 21- Divisor wandelt die Einheiten in GB um - wir könnten es du -kx
mit $1 > 512*1024
und verwenden s/1024^2
, um besser lesbar zu sein). Innerhalb der awk-Bedingung stellen wir s
die Größe ein, damit wir sie aus der Zeile entfernen können ( $0
). Dadurch bleibt das Trennzeichen (das auf ein einzelnes Leerzeichen reduziert ist) erhalten, sodass das Finale %s
ein Leerzeichen und anschließend den Namen des aggregierten Verzeichnisses darstellt. %7s
richtet die gerundete %.2f
GB-Größe aus (erhöhen auf %8s
> 10 TB).
Im Gegensatz zu den meisten Lösungen werden hier Verzeichnisse mit Leerzeichen im Namen ordnungsgemäß unterstützt (obwohl jede Lösung, einschließlich dieser, Verzeichnisnamen mit Zeilenumbrüchen falsch behandelt).