Предположим, что есть каталог хранения изображений, скажем, ./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
Прежде всего вам понадобятся две вещи:
- опция ,
-c
чтобыdu
указать ему вывести общую сумму; - или
**
(инструкции по активации) илиfind
(пример) или для обхода подкаталогов.
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=-