Как показать только общий размер файла определенного расширения командой `du`

11

У меня есть сотни PDF-файлов и HTML-файлов в каталоге. И я хочу знать общий размер PDF-файлов.

По команде du -ch /var/fooя вижу общий размер файла, но мне нужна только последняя строка, общий размер.

Если каталог содержит только PDF-файлы, я могу использовать -sпараметр, но этот параметр нельзя использовать на этот раз.

Как я могу получить только общий размер файла определенного типа?

Ironsand
источник
Не можете ли вы использовать как du -sh /foo/*.pdf?
Багавадхар
2
du -ch /var/foo/*.pdf | tail -n 1
don_crissti

Ответы:

10

В GNU du(то есть в не встроенном Linux или Cygwin) вы можете использовать эту --excludeопцию, чтобы исключить файлы, которые вы не хотите сопоставлять.

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

Если вы хотите точно сопоставить *.pdfфайлы, вам нужно будет использовать какой-то другой метод для duвывода списка файлов, и он будет отображать по крайней мере одну строку для каждого аргумента плюс итоговую сумму с параметром -c. Вы можете позвонить, tailчтобы удалить все, кроме последней строки, или sed, чтобы удалить слово «итого». Чтобы перечислить файлы в этом каталоге, используйте подстановочные знаки в оболочке.

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

Если вам также необходимо просмотреть файлы в подкаталогах, используйте findили используйте **/шаблон, если ваша оболочка это поддерживает. В **/bash сначала запустите shopt -s extglobи обратите внимание, что версии bash до 4.2 будут проходить символические ссылки на каталоги; в zsh это работает из коробки.

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

Дополнительным осложнением для версии find является то, что если файлов слишком много, они findбудут запускаться duболее одного раза, чтобы не превышать ограничение длины командной строки. При использовании подстановочного метода вы получите ошибку, если это произойдет («превышен предел длины командной строки»). Следующий код предполагает, что у вас нет подходящего имени файла, содержащего символ новой строки.

find /var/foo -name '*.pdf' -exec du -sc {} + |
awk '$2 == "total" {total += $1} END {print total}'
Жиль "ТАК - перестань быть злым"
источник
(возможно, это не проблема на практике, но обратите внимание, что это --exclude='*.html'может привести /var/foo/dir.html/foo.pdfк тому, что исключения не будут учитываться, поскольку исключения также влияют /var/foo
Стефан
3

Вы можете позволить оболочке расширять файлы:

$ 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

Однако, как вы можете видеть, это указывает на то, что размеры файлов примерно 1000 раз только что созданы. Лучшим вариантом является использование -bпараметра:

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

Большие размеры файлов по-прежнему будут отображаться в удобочитаемой форме, например 173K.

Энтон
источник
duпоказывает использование диска каждым файлом (в большинстве файловых систем это размер файла, округленный до следующего кратного размеру блока). С опцией -b, duпоказывает размер каждого файла.
Жиль "ТАК - перестань быть злым"