Размер всех файлов определенного расширения в дереве каталогов

Я хочу знать размер файла с.o расширением (объектный файл) в моей Домашней папке.

Я могу найти все использование объектных файлов

find . -name '*.o'

Как я могу теперь вычислить общий размер тех файлов?

15
задан 28 July 2017 в 23:44

3 ответа

Вы ищете каналы (|). Они - способ соединить несколько команд и передать вывод одной команды, как введено другому. В этом случае Вы хотите передать все имена файлов, к которым Вы находите, как введено du (который вычисляет размер). Однако, потому что du ожидает имена файлов и результаты find просто список текста (да, текст состоит из имен файлов, но du не может знать, что, все, что это видит, является текстом), необходимо использовать что-то как xargs который будет проводить каждую строку текста, рассматривать его как имя файла и передачу это к du. Соединяя все это, мы добираемся:

find . -name "*.o" | xargs du -sch
  • необходимо всегда заключать в кавычки шаблоны, которым Вы даете find (когда я сделал выше: "*.o"). Если Вы не сделаете, то оболочка расширится *.o к названиям любых файлов соответствия в текущем каталоге. Это работало в этом случае только потому, что у Вас не было файлов соответствия.

  • -sch флаги для du документируются в man du:

    -c, --total
          produce a grand total
    -h, --human-readable
          print sizes in human readable format (e.g., 1K 234M 2G)
    -s, --summarize
          display only a total for each argument
    

Обратите внимание, однако, что это перестанет работать для имен файлов, содержащих пробел. Это почти наверняка не собирается быть проблемой для объектных файлов, но в будущем, если также необходимо иметь дело с пробелами, используйте:

find . -name "*.o" -print0 | xargs -0 du -sch

-print0 делает find распечатайте РАЗДЕЛЕННЫЕ ОТ ПУСТОГО УКАЗАТЕЛЯ строки и -0 делает xargs проводите такие строки, как введено.

С другой стороны, Вы можете иметь find распечатайте размеры самостоятельно и затем суммируйте их:

find . -name "*.o" -printf '%s\n' | awk '{c+=$1}END{print c}'

Это также обойдет проблему, упомянутую @Serg в комментариях, где существует слишком много аргументов, и команда повреждается в отдельные команды.


Если Вы используете bash (Вы, вероятно), существует более простой путь:

shopt globstar 
du -sch **/*.o

shopt globstar команда делает ** соответствуйте всем файлам и или больше подкаталогов. После включения его, **/*.o будет соответствовать всем файлам (и каталоги), чье имя заканчивается в .o, таким образом, мы можем передать это непосредственно du.

Отметьте это, в отличие от этого, find подход, это не будет соответствовать скрытым файлам (те, имя которых запускается с a .). Для соответствия им также сделайте:

shopt -s dotglob globstar
du -sch **/*.o
23
ответ дан 23 November 2019 в 02:42

Используйте -exec флаг для выполнения du команда с ; (значение на каждый файл)

find . -name "*.o" -exec du -b {} \; | awk '{total+=$1}END{print total}' 

Демонстрационный вывод:

$ find . -name "*.txt"  -exec du -b {} \; | awk '{total+=$1}END{print total,"bytes" }'                                     
find: ‘./.cache/gvfs-burn’: Permission denied
find: ‘./.cache/unity’: Permission denied
852690242 bytes

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

du -b -c *.o
8
ответ дан 23 November 2019 в 02:42

с жемчугом:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

Размер всех нескрытых файлов PDF в текущем каталоге.

0
ответ дан 23 November 2019 в 02:42

Другие вопросы по тегам:

Похожие вопросы: