Ich habe ein Dateisystem mit ein paar Millionen Dateien und möchte eine rekursive Verteilung der Dateigrößen in einem bestimmten Verzeichnis sehen. Ich denke, dass dies mit etwas Bash / Awk Fu völlig machbar ist, aber eine Hand gebrauchen könnte. Grundsätzlich hätte ich gerne Folgendes:
1KB: 4123
2KB: 1920
4KB: 112
...
4MB: 238
8MB: 328
16MB: 29138
Count: 320403345
Ich denke, dass dies bei einer Schleife und einer bedingten log2-Dateigröße nicht so schlimm sein sollte, aber ich kann nicht so recht dahin kommen.
Verwandte Frage: Wie kann ich Dateien finden, die größer / kleiner als x Bytes sind? .
linux
command-line
bash
unix
notpeter
quelle
quelle
ls
zu einfind
. Ich stelle es wieder so wie es war.xargs
jedoch erheblich schneller als-exec
, daher habe ich diese Methode verwendet.Basierend auf Gary Johns Antwort ist hier ein Einzeiler, der auch die Ausgabe für Menschen lesbar formatiert:
Hier ist die erweiterte Version davon:
In der ersten habe
awk
ich eine minimale Dateigröße definiert, um alle Dateien mit weniger als 1 KB an einem Ort zu sammeln. Im zweitenawk
Schritthuman(x)
wird die Funktion zum Erstellen einer für Menschen lesbaren Größe definiert. Dieser Teil basiert auf einer der Antworten hier: /unix/44040/a-standard-tool-to-convert-a-byte-count-into-human-kib-mib-etc -like-du-ls1Die Beispielausgabe sieht folgendermaßen aus:
quelle
Versuche dies:
AUSGABE :
ERLÄUTERUNG:
find . -type f -exec ls -lh {} \;
: einfach genug, finde Dateien im aktuellen Verzeichnis und startels -lh
siematch($5,/([0-9.]+)([A-Z]+)/,k);
: Hiermit wird die Dateigröße extrahiert und jede Übereinstimmung im Array gespeichertk
.if(!k[2]){print "1K"}
: Wennk[2]
undefiniert ist, ist die Dateigröße <1 KB. Da ich mir vorstelle, Sie interessieren sich nicht für so kleine Größen, wird das Skript1K
für alle Dateien gedruckt , deren Größe <= 1 KB ist.else{printf "%.0f%s\n",k[1],k[2]}
: Wenn die Datei größer als 1 KB ist, runden Sie die Dateigröße auf die nächste Ganzzahl und drucken Sie sie zusammen mit dem Modifikator (K, M oder G).sort | uniq -c
: Zählen Sie die Vorkommen jeder gedruckten Zeile (Dateigröße).sort -hk 2
: Sortieren nach dem zweiten Feld in lesbarem Format. Auf diese Weise7G
wird nach sortiert8M
.quelle