Я хочу знать размер файла с.o расширением (объектный файл) в моей Домашней папке.
Я могу найти все использование объектных файлов
find . -name '*.o'
Как я могу теперь вычислить общий размер тех файлов?
Вы ищете каналы (|
). Они - способ соединить несколько команд и передать вывод одной команды, как введено другому. В этом случае Вы хотите передать все имена файлов, к которым Вы находите, как введено 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
Используйте -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
с жемчугом:
perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf
Размер всех нескрытых файлов PDF в текущем каталоге.