So zeigen Sie nur die Gesamtdateigröße einer bestimmten Erweiterung mit dem Befehl `du` an

11

Ich habe Hunderte von PDF- und HTML-Dateien in einem Verzeichnis. Und ich möchte die Gesamtgröße der PDF-Dateien wissen.

Auf Befehl du -ch /var/fookann ich die Gesamtgröße der Datei sehen, aber ich brauche nur die letzte Zeile, die Gesamtgröße.

Wenn das Verzeichnis nur PDF-Dateien enthält, kann ich die -sOption verwenden, aber die Option kann diesmal nicht verwendet werden.

Wie kann ich nur die Gesamtgröße eines bestimmten Dateityps ermitteln?

Eisensand
quelle
Kannst du nicht gerne benutzen du -sh /foo/*.pdf?
Bagavadhar
2
du -ch /var/foo/*.pdf | tail -n 1
don_crissti

Antworten:

10

Mit GNU du(dh unter nicht eingebettetem Linux oder Cygwin) können Sie die --excludeOption verwenden, um die Dateien auszuschließen, die nicht übereinstimmen sollen.

du -s --exclude='*.html' /var/foo

Wenn Sie *.pdfDateien positiv abgleichen möchten , müssen Sie eine andere Methode zum Auflisten der Dateien verwenden und dumindestens eine Ausgabezeile pro Argument sowie eine Gesamtsumme mit der Option anzeigen -c. Sie können rufen tailalle , aber die letzte Zeile zu entfernen, oder sed das Wort „total“ als auch zu entfernen. Verwenden Sie Platzhalter in der Shell, um die Dateien in diesem einen Verzeichnis aufzulisten.

du -sc /var/foo/*.pdf | tail -n1
du -sc /var/foo/*.pdf | sed -n '$s/\t.*//p'

Wenn Sie auch Dateien in Unterverzeichnissen durchlaufen müssen, verwenden Sie findoder verwenden Sie ein **/Muster, wenn Ihre Shell dies unterstützt. **/Führen Sie in Bash zuerst aus shopt -s extglobund beachten Sie, dass Bash-Versionen bis 4.2 symbolische Links zu Verzeichnissen durchlaufen. in zsh funktioniert dies sofort.

du -sc /var/foo/**/*.pdf | tail -n1

Eine zusätzliche Komplikation mit dem Fund Version ist , dass , wenn es zu viele Dateien sind, findlaufen dumehr als einmal, unter der Befehlszeile Längengrenze zu halten. Bei der Platzhaltermethode wird in diesem Fall eine Fehlermeldung angezeigt ("Befehlszeilenlängenbeschränkung überschritten"). Der folgende Code setzt voraus, dass Sie keinen passenden Dateinamen haben, der eine neue Zeile enthält.

find /var/foo -name '*.pdf' -exec du -sc {} + |
awk '$2 == "total" {total += $1} END {print total}'
Gilles 'SO - hör auf böse zu sein'
quelle
(In der Praxis wahrscheinlich kein Problem, aber beachten Sie, dass --exclude='*.html'dies /var/foo/dir.html/foo.pdfnicht dazu führen würde, dass die Ausschlüsse auch die Verzeichnisüberquerung beeinflussen. Außerdem wird die Festplattennutzung von Verzeichnissen einschließlich sich /var/fooselbst berücksichtigt.)
Stéphane Chazelas,
3

Sie können die Dateien von der Shell erweitern lassen:

$ mkdir foo
$ echo "abc" > foo/1.pdf
$ echo "abcd" > foo/2.pdf
$ echo "abcd" > foo/3.html
$ du -ch foo/*.pdf
4,0K    foo/1.pdf
4,0K    foo/2.pdf
8,0K    total

Wie Sie jedoch sehen können, zeigt dies die Dateigröße etwa 1000 Mal an, wie sie gerade erstellt wurde. Eine bessere Option ist die Verwendung der -bOption:

$ du -cbh foo/*.pdf
4   foo/1.pdf
5   foo/2.pdf
9   total

Große Dateigrößen werden weiterhin in lesbarer Form angezeigt, z 173K.

Anthon
quelle
duZeigt die Festplattennutzung jeder Datei an (auf den meisten Dateisystemen ist dies die Dateigröße, die auf das nächste Vielfache der Blockgröße aufgerundet wird). Mit der Option -b, duzeigt die Größe der einzelnen Dateien.
Gilles 'SO - hör auf böse zu sein'