Рішення
Надаючи опцію -c(або --total) до du(1), ви можете доручити їй отримати загальну суму. Якщо ваша реалізація du(1)підтримує будь-який з цих параметрів, ви можете досягти бажаного ефекту, використовуючи наступну команду:
$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +
EDIT: Зауважте, що якщо кількість файлів перевищує максимальну кількість параметрів, дозволених вашою системою, 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