Größe erhalten nur mit du Dateien


50

Wie kann ich die Größe aller Dateien und aller Dateien in ihren Unterverzeichnissen mit dem Befehl du ermitteln?

Ich versuche den folgenden Befehl, um die Größe aller Dateien (und Dateien in Unterverzeichnissen) zu erhalten

find . -type f | du -a

Damit werden aber auch die Ordnergrößen ausgedruckt. Wie kann ich eine Liste der Größen aller Dateien und Dateien in Unterverzeichnissen erhalten? Ich habe auch versucht, exec flagaber ich bin nicht sicher, wie ich die Ausgabe in einen anderen Befehl umleiten soll, nachdem er die Ergebnisse von findinto ausgeführt hat du.

Das Betriebssystem ist AIX 6.1 mit ksh-Shell.

Antworten:


56

Normalerweise benutze ich das -execDienstprogramm. So was:

find . -type f -exec du -a {} +

Ich habe es sowohl auf bash als auch auf ksh mit GNU find versucht. Ich habe AIX nie ausprobiert, aber ich bin sicher, dass Ihre Version von find eine -execSyntax hat.

Das folgende Snippet sortiert die Liste, das größte zuerst:

find . -type f -exec du -a {} + | sort -n -r | less

3
Ich würde mit dieser Antwort weitermachen, wenn Sie keinen Zugriff auf find -print0oder andere GNU-Funktionen haben. Falls vorhanden, ersetzt \;mit \+in weniger Anrufungen führen duund damit eine bessere Leistung.
jw013

Danke, das klappt super, zumal du eine Flagge für die Größe in verschiedenen Einheiten anbietest.
Shardul Upadhyay

Ich konnte keine Informationen zu dieser +Option finden. Ist das eine Option für duoder für find? Und warum kommt es zu weniger Anrufen?
Amelio Vazquez-Reina

1
Es ist eine Standardoption von find. Es gibt execden Befehl (in unserem Fall du) nur einmal an, wobei alle Ergebnisse findals aufeinanderfolgende Argumente für den Befehl angegeben werden.
Rahmu

wtf, warum gibt es nicht einen Befehl wiedu -f --threshold=1G
Alexander Mills

16

Wenn Sie GNU-Dienstprogramme haben, versuchen Sie es

find . -type f -print0 | du --files0-from=-

Der Befehl schlägt fehl und sagt, dass print0 kein gültiger Befehl ist und dass das letzte Minus kein erkanntes Flag war. Ich denke nicht, dass dieser Ansatz funktionieren wird, da man dua filesoder fromflag nicht aufgelistet werden.
Shardul Upadhyay

Sie sollten Ihr Betriebssystem als Tag zur Frage hinzufügen. Ich nahm an, Sie hatten GNU, vergaß aber, das zu erwähnen.
jw013

1
Habe eine Gegenstimme zu mir! Ihre bestimmte Lösung funktioniert mit du -ch, um eine Gesamtsumme der übereinstimmenden Dateien zu erhalten:find . -name 'blah blah.*' -print0 | du --files0-from=- -ch
Michael Goldshteyn

9

Ich benutze im Allgemeinen:

find . -type f -print0 | xargs -r0 du -a

Xargs ruft normalerweise den Befehl auf, auch wenn keine Argumente übergeben wurden. xargs du </dev/nullwird noch angerufen werden, xargs -r du </dev/nulldu nicht anrufen. Das -0Argument sucht nach nullterminierten Zeichenfolgen anstelle von Zeilenumbrüchen.

Dann addiere ich normalerweise | awk '{sum+=$1} END {print sum}'am Ende, um die Summe zu erhalten.


2
Das then I usually addist Gold wert :-)
Radek

2

Hier ist eine Version mit langen Parameternamen und menschlicher Sortierung.

find . -type f -exec du --human {} + | sort --human --reverse | head

Ich sah auch keinen Grund -a/--all, weitergegeben zu werden du.


-2

bestimmte Dateien im aktuellen Verzeichnis

du -ch files*

ist kürzer und funktioniert bei mir

du -sh .

für aktuelles Verzeichnis und alle Dateien in sub

du (GNU coreutils) 8.30


1
(1) Was meinst du damit du -ch files*? Angenommen , das aktuelle Verzeichnis enthält ant, apple, banana, bat, cat, corn, date, und dog, wo die Tiernamen sind Verzeichnisse und das Obst / Gemüse Namen sind Dateien - welcher Befehl würden Sie nur die Dateien erhalten benutzen? Oder hast du das nicht gemeint? (2)  du -sh .meldet nur eine Gesamtsumme von allem in und unter dem aktuellen Verzeichnis und überhaupt nicht die Dateien selbst. Dies ist so ziemlich das genaue Gegenteil von dem, was die Frage verlangt.
G-Man sagt, dass Monica
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.