Показати суму розмірів файлів у списку каталогів


71

Команда з dirпереліком каталогу директорій Windows має в кінці рядок із загальним обсягом місця, зайнятим переліченими файлами. Наприклад, dir *.exeпоказує всі .exeфайли в поточному каталозі, їх розміри та загальну суму їх розмірів. Я хотів би мати аналогічну функціональність з моїм dirпсевдонімом в bash, але я не впевнений, як саме це робити.

В даний час я alias dir='ls -FaGl'в своєму .bash_profile, показуючи

drwxr-x---+  24 mattdmo  4096 Mar 14 16:35 ./
drwxr-x--x. 256 root    12288 Apr  8 21:29 ../
-rw-------    1 mattdmo 13795 Apr  4 17:52 .bash_history
-rw-r--r--    1 mattdmo    18 May 10  2012 .bash_logout
-rw-r--r--    1 mattdmo   395 Dec  9 17:33 .bash_profile
-rw-r--r--    1 mattdmo   176 May 10  2012 .bash_profile~
-rw-r--r--    1 mattdmo   411 Dec  9 17:33 .bashrc
-rw-r--r--    1 mattdmo   124 May 10  2012 .bashrc~
drwx------    2 mattdmo  4096 Mar 24 20:03 bin/
drwxrwxr-x    2 mattdmo  4096 Mar 11 16:29 download/

наприклад. Відповіді на це запитання :

dir | awk '{ total += $4 }; END { print total }'

що дає мені загальну суму, але не друкує сам каталог каталогу. Чи є спосіб змінити це в однолінійний або сценарій оболонки, щоб я міг передати будь-які lsаргументи, які я хочу, dirі отримати повний список плюс загальна сума? Наприклад, я хотів би запустити, dir -R *.jpg *.tifщоб отримати список та загальний розмір цих типів файлів у всіх підкаталогах. В ідеалі було б чудово, якби я міг отримати розмір кожного підкаталогу, але це не суттєво.


5
Чому ls -lhвам не допомагають? Він друкує загальну суму вгорі. Ви також можете запустити, du -sh *.exeщоб отримати інформацію про використання дискового простору в читаній людиною формі.
bavavadhar

@ashwin Я не знаю, що ls -lhдрукує «загальний» , але це не завжди пов’язано з тим, що awkрозраховують нижче сценарії, або з тим, що я додаю вручну. Іноді вона близька до кількості КБ файлів у каталозі, але, схоже, не приймає в дію виділені розміри підкаталогів. Буду вдячний, якщо ви можете вказати мені на пояснення того, що саме таке число ...
MattDMo

подивіться, чи працює моя відповідь нижче
bavavadhar

1
ls -lhне показує загальний розмір dir з обчисленням його вмісту
aequalsb

Відповіді:


25

Наступна функція виконує більшість того, що ви просите:

dir () { ls -FaGl "${@}" | awk '{ total += $4; print }; END { print total }'; }

... але це не дасть тобі того, чого ти просиш dir -R *.jpg *.tif, бо це не так ls -R. Ви можете пограти з findутилітою для цього.


1
Це правда, якщо ви шукаєте, по суті, розмір вмісту кожного файлу, а не розмір, який файл споживає на диску. Ця відмінність більш виражена для дуже малих файлів. У моєму дистрибутиві кожному файлу виділяється місце на диску в 4 шматки КБ (тому для файлу в 300 байт все ще використовується 4K на диску, як повідомляється командою du). З огляду на те, що в ОП шукали "скільки місця займає кожен файл", то ду - це спосіб зробити це.
Джон V

1
dir- це вже назва популярного GNU coreutil, я б краще не називав подібну функцію.
десерт

Виправте, щоб він працював як на Linux, так і на OS-S, і ваш "-a" include ". і "..", що не добре:) Ось фіксована команда: dir () {ls -FAl "$ {@}" | awk '{всього + = $ 5; друк}; END {print "total:" total} '; }
Дмитро Шевкопляс

148

Для цього вже є команда UNIX: du

Просто зробіть:

du -ach 

Згідно з умовами, ви можете додати один або кілька шляхів до файлу або каталогу в кінці команди. -h- це розширення для перетворення розміру у зручний для людини формат, -aнадає "очевидний" розмір (розмір файлу замість використання диска) та -cдає загальний результат у кінці.


12
Так, du працює чудово. Ви можете скористатися опцією -c (так само, як --total), щоб отримати підсумок у кінці списку.
MikeB

6
Зауважте, що duдає використання диска, а не сума розмірів файлів.
Стефан Шазелас

7
du -hне підсумовує розміри переданих до нього файлів. du -h *.soпоказує розмір кожного файлу, але не суму. Я думаю, що ти тут хочеш du -hc *.so(або навіть du -hc *.so | tail -1). Але, звичайно, він також хоче, щоб список довідників теж був.
Обмежене спокутування

1
Ця команда працює лише з коротким списком файлів. Подивіться, що станеться, коли у вас в каталозі 850000 файлів !!!
Хамід ФзМ

3
! -aзасоби --all. Розглянемо скоріше використання--apparent-size
Arnauld VM


8

Просто надрукуйте поточний рядок, який ви підсумовуєте:

dir | awk '{ print; total += $4 }; END { print "total size: ",total }'

6

з perl:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

Розмір усіх не прихованих PDF-файлів у поточному каталозі.


1

Додавання наступного до .bash_profile або .bashrc працює для мене.

dir ()
{
find . -iname "$@" -exec ls -lh {} \;
find . -iname "$@" -print0|xargs -r0 du -csh|tail -n 1;
}

Тепер, коли я роблю dir * .mp3, він робить рекурсивно і друкує загальну кількість в кінці. Ви можете керувати необхідною глибиною, додаючи параметр maxdepth до знахідки. Я знаю, що біг знайти два рази - це не дуже ефективна ідея. Але я не міг думати про кращий спосіб. По крайней мере, це виконує роботу.


1

Використання du та awk заяви на зразок зазначеного вище, забезпечать те, що ви шукаєте.

Приклад: du /home/abc/Downloads/*.jpg | awk '{ print; total += $1 }; END { print "total size: ",total }'

Тут буде перераховано всі файли в папці Завантаження користувача abc, що закінчується .jpg, і надрукується сума всіх цих файлів у кінці списку.


0

Щоб отримати обидва, dir вихід і обчислення розміру, не використовуючи жодного з інших запропонованих варіантів, ви можете використовувати tee (1) та процес заміни ...

dir | tee >( awk '{ total += $4 }; END { print total }' )

Не потрібно tee, простоdir | awk '{print; total += $4}; END {print total}'
Стефан Шазелас

0
du path_to_your_files/*.jpg | awk '{ total += $1 }; END { print total }'

3
Ні. По-перше, просто давання команди - це не відповідь. По-друге, якби ви попросили прочитати ціле запитання, інші відповіді та мої коментарі, ви б побачили, що це НЕ, що я хочу.
MattDMo

Щоб бути справедливим до плаката, це перший результат пошуку в пошуку Google linux sum human readable sizesі це те, що я шукаю.
Шрідхар Сарнобат

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.