Решение
Предоставляя опцию -c(или --total) для du(1), вы можете дать ей указание произвести итоговую сумму. Если ваша реализация du(1)поддерживает один из этих параметров, вы можете добиться желаемого эффекта с помощью следующей команды:
$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +
РЕДАКТИРОВАТЬ: обратите внимание, что если количество файлов превышает максимальное количество параметров, разрешенных вашей системой, findвсе равно может выполняться commandнесколько раз. Некоторые реализации du(1)также поддерживают чтение имен файлов из файла, который не страдает от упомянутого ограничения:
$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames
объяснение
Разница между семантикой -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
-print0Опция заставляет find(1)печатать найденные имена файлов в стандартный вывод , разделенных нулевым символом, а --files0-fromопция вызывается du(1)для чтения нуль разделенных имен файлов. В отличие от символа новой строки, нулевой символ может не отображаться в имени файла, поэтому вывод является однозначным.
Чтобы узнать больше о возможностях du(1)и find(1), вам следует обратиться к соответствующим страницам справки:
$ man du
$ man find