В принятом ответе предлагается использовать
find . -regex '.*\.bak' -print0 | du --files0-from=- -ch | tail -1
, но это не работает в моей системе, поскольку du
не знает опции --files-0-from
в моей системе.Только GNU du
знает эту опцию, она не является частью POSIX Standard (поэтому вы не найдете ее во FreeBSD или macOS), и при этом вы не найдете ее в системах на базе BusyBox Linux (например, большинство встроенных систем Linux) или любая другая система Linux, которая не использует версию GNU du
.
Тогда есть ответ, предлагающий использовать:
find path/to/directory -iregex .*\.bak$ -exec du -csh '{}' + | tail -1
Это решениебудет работать до тех пор, пока не будет найдено слишком много файлов, так как +
означает, что find
попытается вызвать du
с максимально возможным количеством обращений за один вызов, однако может быть максимальное количество аргументов(N) система поддерживает, и если будет больше совпадений, чем это значение, find
будет вызывать du
несколько раз, разбивая попадания на группы, меньшие или равные N элементов каждый, и в этом случае результат будет неправильным и толькопокажите размер последнего du
вызова.
Наконец, есть ответ, использующий stat
и awk
, который является хорошим способом сделать это, но он использует глобализацию оболочки таким образом, чтотолько Баш4.x или более поздняя поддержка.Он не будет работать со старыми версиями и, если он работает с другими оболочками, непредсказуем.
Решение, соответствующее POSIX (работает в Linux, macOS и любых вариантах BSD), которое не страдает какими-либо ограничениями и будетнаверняка работа с каждой оболочкой будет:
find . -regex '.*\.bak' -exec stat -f "%z" {} \; | awk '{s += $1} END {print s}'