Рассчитать размер файлов в оболочке - PullRequest
53 голосов
/ 01 марта 2009

Я пытаюсь вычислить общий размер в байтах всех файлов (в дереве каталогов), соответствующих шаблону имени файла, просто используя оболочку. Это то, что я до сих пор:

find -name * .undo -exec stat -c% s {} \; | awk '{total + = $ 1} END {print total}'

Есть ли более простой способ сделать это? Я чувствую, что должен быть простой переключатель du или find, который делает это для меня, но я не могу его найти.

Чтобы быть понятным, я хочу, чтобы общее количество файлов, соответствующих шаблону в любом месте дерева каталогов, что означает

du -bs * .undo

не будет работать, потому что он соответствует только файлам в текущем каталоге.

Ответы [ 15 ]

95 голосов
/ 01 марта 2009

Попробуйте:

find . -name "*.undo" -ls | awk '{total += $7} END {print total}'

В моей системе размер файла - седьмое поле в выводе find -ls. Если ваш find … -ls вывод отличается, отрегулируйте.

В этой версии использование информации существующего каталога (размера файла) и встроенной функции ls find должно быть эффективным, избегая создания процессов или файлового ввода-вывода.

35 голосов
/ 01 марта 2009

С zsh вы можете использовать расширенную глобализацию для:

du -c ** / *. Отменить

22 голосов
/ 18 мая 2009
find -name *.undo -print0 | du -hc --files0-from=-
18 голосов
/ 01 марта 2009
du -c *pattern*

Это напечатает сумму на последней строке вывода.

9 голосов
/ 09 июня 2011

Я тоже смотрел на эту проблему (только год спустя ...) - только что нашел эту страницу.

Что-то, что я нашел, работает (для меня) следующее:

find /mnt/iso -name *.avi -printf "%s\n" | paste -sd+ - | bc

Это вернет общий размер всех файлов .avi во всех подпапках ниже / mnt / iso

Я должен отдать должное Радулову за команду вставки - см. Эту страницу: Команда оболочки для суммирования целых чисел, по одному на строку?

Просто для добавления - на случай, если папка соответствует поисковому запросу - также неплохо использовать -type f в команде поиска.

8 голосов
/ 01 марта 2009
find -name '*.undo' -exec wc -c {} + | tail -n 1

должно давать фактическое общее количество байтов в файлах, если у вас не слишком много файлов (где «слишком много» будет очень большим числом, вероятно, в тысячах). Или, если вы хотите получить номер один,

find -name '*.undo' -exec wc -c {} + | tail -n 1 | cut -d' ' -f 1
5 голосов
/ 01 марта 2009

Python является частью большинства дистрибутивов Linux.

import os
import fnmatch
size= 0
for path, dirs, files in os.walk( '.' ):
    for f in files:
        if fnmatch.fnmatch(f,'*.py'):
            fileSize= os.path.getsize( os.path.join(path,f) ) 
            print f, fileSize
            size += fileSize
print size

Длинная, но совершенно четкая и легко растяжимая.

3 голосов
/ 13 апреля 2010
find -name '*.undo' -print0 | du -hc --files0-from=- | tail -n 1

Собраны из вкладов gerdemb и Страгера. Использование du -cb должно отображать байты.

2 голосов
/ 18 июля 2013

Я использую команду du таким образом, чтобы получить только число:

du file_list | awk '{s+=$1} END {print s}'
0 голосов
/ 11 мая 2017

Я думаю, что версия с xargs может быть улучшена (упрощена) ls -1 * .undo | xargs wc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...