Jak wyświetlić tylko całkowity rozmiar pliku określonego rozszerzenia za pomocą polecenia `du`

11

Mam w katalogu setki plików pdf i html. I chcę poznać całkowity rozmiar plików pdf.

Z polecenia du -ch /var/foowidzę całkowity rozmiar pliku, ale potrzebuję tylko ostatniego wiersza, całkowitego rozmiaru.

Jeśli katalog zawiera tylko pliki pdf, mogę użyć -sopcji, ale tym razem nie można użyć tej opcji.

Jak mogę uzyskać tylko całkowity rozmiar określonego typu pliku?

żelazko piaskowe
źródło
Nie możesz użyć du -sh /foo/*.pdf?
bagavadhar
2
du -ch /var/foo/*.pdf | tail -n 1
don_crissti

Odpowiedzi:

10

W GNU du(tj. W niewbudowanym systemie Linux lub Cygwin) możesz użyć --excludeopcji wykluczenia plików, których nie chcesz dopasowywać.

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

Jeśli chcesz pozytywnie dopasować *.pdfpliki, musisz użyć innej metody, aby wyświetlić listę plików, i duwyświetli co najmniej jedną linię wyjściową na argument, plus ogólną sumę z opcją -c. Możesz zadzwonić, tailaby usunąć wszystko oprócz ostatniego wiersza, lub sed, aby usunąć również słowo „total”. Aby wyliczyć pliki w tym jednym katalogu, użyj symboli wieloznacznych w powłoce.

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

Jeśli potrzebujesz również przejść do plików w podkatalogach, użyj findlub użyj **/wzorca, jeśli twoja powłoka to obsługuje. W przypadku **/bash, pierwszego uruchomienia shopt -s extglobi zauważ, że wersje bash do 4.2 będą przechodzić przez dowiązania symboliczne do katalogów; w zsh działa to od razu po wyjęciu z pudełka.

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

Dodatkową komplikacją związaną z wersją find jest to, że jeśli jest zbyt wiele plików, finduruchomi się duwięcej niż jeden raz, aby zachować limit długości wiersza poleceń. Dzięki metodzie wieloznacznej pojawi się błąd, jeśli tak się stanie („Przekroczono limit długości wiersza poleceń”). Poniższy kod zakłada, że ​​nie masz pasującej nazwy pliku zawierającej znak nowej linii.

find /var/foo -name '*.pdf' -exec du -sc {} + |
awk '$2 == "total" {total += $1} END {print total}'
Gilles „SO- przestań być zły”
źródło
(prawdopodobnie nie jest to problem w praktyce, ale należy pamiętać, że --exclude='*.html'nie spowodowałoby /var/foo/dir.html/foo.pdfto liczenia, ponieważ wykluczenia wpływają również na przechodzenie do katalogu; uwzględnione /var/foobyłoby również użycie dysku przez katalogi, w tym samego siebie)
Stéphane Chazelas,
3

Możesz pozwolić powłoce rozwinąć pliki:

$ 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

Jak jednak widać, wskazuje to na rozmiar pliku około 1000 razy, jak właśnie utworzono. Lepszą opcją jest użycie -bopcji:

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

Duże rozmiary plików będą nadal wyświetlane w postaci czytelnej dla człowieka, np 173K.

Anthon
źródło
dupokazuje użycie dysku dla każdego pliku (w większości systemów plików, jest to rozmiar pliku zaokrąglony w górę do następnej wielokrotności rozmiaru bloku). Z opcją -b, dupokazuje rozmiar każdego pliku.
Gilles „SO- przestań być zły”