Получение размера только с использованием файлов du

51

Как я могу получить размер всех файлов и всех файлов в его подкаталогах, используя команду du.

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

find . -type f | du -a

Но это также распечатывает размеры папок. Как я могу получить список размеров всех файлов и файлов в подкаталогах? Я также пытался, exec flagно я не уверен, как передать вывод в другую команду после того, как она выполняет результаты findв du.

Операционная система AIX 6.1 с оболочкой ksh.

Шардул Упадхяй
источник

Ответы:

57

Я обычно пользуюсь -execутилитой. Нравится:

find . -type f -exec du -a {} +

Я пробовал это как на bash, так и на ksh с GNU find. Я никогда не пробовал AIX, но уверен, что ваша версия find имеет некоторый -execсинтаксис.

Следующий фрагмент сортирует список по величине первым:

find . -type f -exec du -a {} + | sort -n -r | less
rahmu
источник
3
Я бы пошел с этим ответом, если у вас нет доступа find -print0или других функций GNU. Если доступно, замена \;на \+приведет к меньшему количеству вызовов duи, следовательно, к лучшей производительности.
jw013
Спасибо, это отлично работает, тем более что du предлагает флаг для размера в разных единицах.
Шардул Упадхяй
Я не мог найти информацию о +варианте. Это вариант для duили для find? И почему это приводит к меньшему количеству звонков?
Амелио Васкес-Рейна
1
Это стандартная опция find. Он указывает execкоманде (в нашем случае du) только один раз, причем все результаты findвыдаются в качестве последовательных аргументов команды.
Рахму
wtf, почему нет такой команды, какdu -f --threshold=1G
Александр Миллс
16

Если у вас есть утилиты GNU, попробуйте

find . -type f -print0 | du --files0-from=-
jw013
источник
Команда терпит неудачу, говоря, что print0 не является допустимой командой, и что последний минус не был распознанным флагом. Я не думаю, что этот подход будет работать, потому man duчто не перечисляет filesили fromфлаг.
Shardul Upadhyay
Вы должны добавить свою операционную систему в качестве тега к вопросу. Я предполагал, что у вас есть GNU, но забыл упомянуть об этом.
jw013
1
Поддержи меня! Ваше конкретное решение работает, du -chчтобы получить общее количество подходящих файлов:find . -name 'blah blah.*' -print0 | du --files0-from=- -ch
Майкл Гольдштейн
9

Я обычно использую:

find . -type f -print0 | xargs -r0 du -a

Xargs обычно вызывает команду, даже если аргументы не переданы; xargs du </dev/nullвсе равно xargs -r du </dev/nullбудет звонить, не буду звонить ду. В -0аргументе выглядит для завершающего нуля строк , вместо символа новой строки прекращается.

Затем я обычно добавляю | awk '{sum+=$1} END {print sum}'в конце, чтобы получить сумму.

Arcege
источник
2
Это then I usually addстоит золота :-)
Radek
2

Вот версия с длинными именами параметров и человеческой сортировкой.

find . -type f -exec du --human {} + | sort --human --reverse | head

Я также не видел необходимости -a/--allбыть переданным du.

Тарраш
источник
-2

конкретные файлы в текущем каталоге

du -ch files*

короче и у меня работает

du -sh .

для текущего каталога и всех файлов в сабе

du (GNU coreutils) 8.30

коротышка
источник
1
(1) Что вы подразумеваете под du -ch files*? Предположим , что текущий каталог содержит ant, apple, banana, bat, cat, corn, date, и dog, где имена животных подкаталоги и фрукты / овощи имена файлов - то , что команда будет использовать , чтобы получить только файлы? Или это не то, что вы имели в виду? (2)  du -sh .будет сообщать только общее количество всего в текущем каталоге и под ним, а не сами файлы вообще. Это в значительной степени полная противоположность тому, что задан вопрос.
G-Man говорит: «Восстанови Монику»