Найти общий размер определенных файлов в ветви каталога

Найти общий размер определенных файлов в ветви каталога

Предположим, что есть каталог хранения изображений, скажем, ./photos/john_doe, внутри которого есть несколько подкаталогов, где находятся многие определенные файлы (скажем, *.jpg). Как я могу вычислить суммарный размер этих файлов ниже john_doeветви?

Я пробовал du -hs ./photos/john_doe/*/*.jpg, но это показывает только отдельные файлы. Также это отслеживает только первый уровень вложенности каталога john_doe, как john_doe/june/, но пропускает john_doe/june/outrageous/.

Итак, как мне пройтись по всей ветке, суммируя размер определенных файлов?

решение1

find ./photos/john_doe -type f -name '*.jpg' -exec du -ch {} + | grep total$

Если требуется более одного вызова duиз-за очень длинного списка файлов, будут выведены несколько итоговых значений, которые необходимо суммировать.

решение2

du -ch public_html/images/*.jpg | grep total
20M total

дает мне общее использование моих .jpgфайлов в этом каталоге.

Чтобы работать с несколькими каталогами, вам, вероятно, придется findкак-то это объединить.

Вы можете найтипримеры команд duполезно (также включает в себя find)

решение3

Прежде всего вам понадобятся две вещи:

du -ch -- **/*.jpg | tail -n 1

решение4

Приведенные до сих пор ответы не учитывают тот факт, что список файлов, переданный из find в du, может быть настолько длинным, что find автоматически разбивает список на части, что приводит к многократным появлениям total.

Вы можете либо grep total(локаль!) ​​суммировать вручную, либо использовать другую команду. Насколько мне известно, есть только два способа получить общую сумму (в килобайтах) всех файлов, найденных find:
find . -type f -iname '*.jpg' -print0 | xargs -r0 du -a| awk '{sum+=$1} END {print sum}'

Объяснение
find . -type f -iname '*.jpg' -print0: Найти все файлы с расширением jpg независимо от регистра (т. е. *.jpg, *.JPG, *.Jpg...) и вывести их (с завершающим нулем).
xargs -r0 du -a: -r: Xargs вызовет команду даже без переданных аргументов, чего не позволяет сделать -r. -0 означает строки с завершающим нулем (не с завершающим символом новой строки).
awk '{sum+=$1} END {print sum}': Суммировать размеры файлов, выведенные предыдущей командой

И для справки, другой путь был бы таким:
find . -type f -iname '*.jpg' -print0 | du -c --files0-from=-

Связанный контент