Решение
Предоставляя опцию -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