Отримання розміру лише з файлами


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, але впевнений, що ваша версія пошуку має якийсь -execсинтаксис.

Наступний фрагмент сортує список, найбільший перший:

find . -type f -exec du -a {} + | sort -n -r | less

3
Я б відповів, якщо у вас немає доступу до find -print0інших функцій GNU. Якщо це можливо, заміна \;на \+призведе до меншої кількості викликів duі, таким чином, до кращої продуктивності.
— jw013

Дякую, це чудово виходить, тим більше, що du пропонує прапор розміром у різних одиницях.
— Шардул Упадхей

Не вдалося знайти інформацію про +варіант. Це варіант для duабо для find? І чому це призводить до меншої кількості дзвінків?
— Амеліо Васкес-Рейна

1
Це стандартний варіант find. Він вказує execкоманді (в нашому випадку du) лише один раз, при цьому всі результати findнаведені як послідовні аргументи для команди.
— rahmu

wtf, чому не існує такої команди, якdu -f --threshold=1G
— Олександр Міллс

16

Якщо у вас є утиліти GNU, спробуйте

find . -type f -print0 | du --files0-from=-

Команда не вдається сказати print0 не є дійсною командою, і останній мінус не був розпізнаним прапором. Я не думаю, що такий підхід працюватиме, оскільки man duне відображає filesані fromпрапорців, ані прапор.
— Шардул Упадхей

Ви повинні додати свою операційну систему як тег до питання. Я припускав, що у вас є GNU, але забув це згадати.
— jw013

1
Запросити мене! Ваше конкретне рішення працює з тим, du -chщоб отримати загальну кількість відповідних файлів:find . -name 'blah blah.*' -print0 | du --files0-from=- -ch
— Michael Goldshteyn

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}'в кінці, щоб отримати загальну суму.


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 .

для поточного dir та всіх файлів у підпункті

du (GNU coreutils) 8.30


1
(1) Що ви маєте на увазі під du -ch files*? Припустимо , що поточний каталог містить ant, apple, banana, bat, cat, corn, date, і dog, де імена тварин підкаталоги і фрукти / овочі імена файлів - то , що команда буде використовувати , щоб отримати тільки файли? Або це не те, що ви мали на увазі? (2)  du -sh .повідомить лише про загальну кількість всього, що знаходиться в поточному каталозі та під ним, а не самі файли. Це майже протилежне тому, що було задано питанням.
— G-Man каже "Відновити Моніку"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.