Як показати лише загальний розмір файлу конкретного розширення командою `du`


11

У мене в каталозі є сотні файлів pdf та html-файлів. І я хочу знати загальний розмір PDF-файлів.

За командою du -ch /var/fooя бачу загальний розмір файлу, але мені потрібен лише останній рядок, загальний розмір.

Якщо каталог містить лише файли у форматі PDF, я можу використовувати -sпараметр, але цей параметр не можна використовувати цей раз.

Як я можу отримати лише загальний розмір певного типу файлу?


Ви не можете використовувати du -sh /foo/*.pdf?
bagavadhar

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, щоб також видалити слово "total". Щоб перерахувати файли в одному каталозі, використовуйте підстановку в оболонці.

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вони працюватимуть 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враховуватиметься використання дискових каталогів, включаючи себе)
Stéphane Chazelas

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показує розмір кожного файлу.
Жил 'SO- перестань бути злим'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.