10

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

Что-то вроде этого:

$ find . -name 'flibble*' -ctime +90 -exec du -sh {} \;

2.1G    ./flibble_116.log
2.1G    ./flibble_83.log
2.1G    ./flibble_211040_157.log
2.1G    ./flibble3747_51.log

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

То , что я хочу , это общая du для всех найденных файлов.

5 ответов5

10

Решение

Предоставляя опцию -c (или --total) для du(1) , вы можете указать ей, что нужно произвести общий итог. Если ваша реализация du(1) поддерживает любую из этих опций, вы можете добиться желаемого эффекта, используя следующую команду:

$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +

объяснение

Разница между семантикой команды -exec command {} \; и -exec command {} + выглядит следующим образом:

  • command {} \; выполняет command один раз для каждого результата find . Путь к результату передается вместо {} .

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} \;
    1
    2
    3
    
  • command {} + выполняет command , когда все результаты получены. Путь к результатам передается вместо {} .

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} +
    1 2 3
    

Чтобы узнать больше о параметрах du(1) и find(1) , вам следует обратиться к соответствующим страницам справки.

4

Попробуй это:

du -c `find . -name 'flibble*' -ctime +90` | tail -1

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

3

Вы можете попробовать это:

find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total
2

Я бы find себе распечатать размер, и использовать другой инструмент для расчета суммы:

find . -name 'flibble*' -ctime +90 -printf "%s\n" |
perl -lnE '$sum += $_} END {say $sum'

Если вы также хотите увидеть имена файлов:

find . -name 'flibble*' -ctime +90 -printf "%s\t%p\n" |
perl -apE '$sum += $F[0]} END {say $sum'
1

Один лайнер, который должен работать для получения общего гигабайта на большинстве систем:

echo "$((($(find. -name 'flibble *' -ctime +90 -type f -printf '% k +') 0)/1024/1024)) GB"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .