Як перелічити розмір кожного файлу та каталогу та сортувати за розміром за бажанням у Bash?


108

Я виявив, що не можна легко змінити розмір каталогу в Bash?

Я хочу, щоб коли я вводив ls -<some options>, він може перераховувати всю суму розміру файлу каталогу рекурсивно та файли одночасно та сортувати за порядком розміру.

Це можливо?


2
Що саме ви маєте на увазі під "розміром" каталогу? Кількість файлів під ним (рекурсивно чи ні)? Сума розмірів файлів під ним (рекурсивно чи ні)? Розмір диска самого каталогу? (Каталог реалізований у вигляді спеціального файлу, що містить імена файлів та іншу інформацію.)
Кіт Томпсон,

повинна бути Сума розмірів файлів під ним рекурсивно
Kit Ho

1
@Kit: Тоді duвідповідь.
Кіт Томпсон

Команда @KeithThompson @KitHo duоцінює використання файлового простору, тому ви не можете використовувати його, якщо хочете отримати точний розмір.
ztank1013

@ ztank1013: Залежно від того, що ви маєте на увазі під "точним розміром", du(принаймні, версія GNU coreutils), ймовірно, є можливість надати інформацію.
Кіт Томпсон

Відповіді:


218

Просто перейдіть до каталогу та виконайте наступну команду:

du -a --max-depth=1 | sort -n

АБО додайте -h для людських читаних розмірів та -r для того, щоб спочатку надрукувати великі каталоги / файли.

du -a -h --max-depth=1 | sort -hr

23
du -hтакож вимагає sort -h, щоб, скажімо, 981Mсортував раніше 1.3G; з sort -nврахуванням лише цифр, які будуть неправильними.
Сміллери

Тут не відображається розмір окремих файлів у поточному каталозі, лише розмір його підкаталогів та загальний розмір поточного каталогу. Як би ви також включали окремі файли у висновок (щоб відповісти на запитання ОП)?
Ерік Траутман

@ErikTrautman, щоб перелічити файли, які також потрібно додати -aта використовувати --allзамість --max-depth=1цьогоdu -a -h --all | sort -h
Франко,

Дивовижно! Я роблю щось ламерне вже кілька років. :)
Колбі Блер

6
sort -hпрацює лише у версії GNU / Linux, не пощастило з BSD / OS X.
djule5

20

Очевидно, --max-depthваріант відсутній у версії duкоманди Mac OS X. Ви можете використовувати наступне.

du -h -d 1 | sort -n


Мабуть, але не дивно.
Джош Хабдас

20
du -s -- * | sort -n

(це не буде показувати приховані (.dotfiles) файли)

Використовуйте du -smдля одиниць Mb тощо. Я завжди користуюся

du -smc -- * | sort -n

тому що сумарний рядок ( -c) закінчиться внизу з очевидних причин :)

PS:

  • Дивіться коментарі щодо обробки точкових файлів
  • Я часто використовую, наприклад, 'du -smc / home / / | сортувати -n | хвіст ', щоб відчути, де саме сидять великі шматочки

5
du --max-depth=1|sort -nабо find . -mindepth 1 -maxdepth 1|xargs du -s|sort -nдля включення точкових файлів теж.
Арно Ле Блан

@arnoud: Я використовую це теж, але це не здається , справа доповненням до цього питання (/ відповідь) :)
sehe

@ arnaud576875, find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -nякщо деякі з знайдених шляхів можуть містити пробіли.
Лрі

1
Це чудовий варіант, щоб зрозуміти людину, яку можна прочитати найбільше:sudo du -smch * | sort -h | tail
marsbard

16

Командування

du -h --max-depth=0 * | sort -hr

Вихід

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

Пояснення

  • du відображає "використання диска"
  • h є для "читабельних для людини" (і в роді, і в ду)
  • max-depth=0означає du, що не відображатимуть розміри підпапок (видаліть, якщо ви хочете показати всі розміри кожного файлу у кожній папці, підпункті, ..., папці)
  • r призначений для "зворотного" (перший найбільший файл)

ncdu

Коли я прийшов до цього питання, я хотів очистити свою файлову систему. Інструмент командного рядка ncduкраще підходить до цього завдання.

Установка на Ubuntu:

$ sudo apt-get install ncdu

Використання:

Просто введіть ncdu [path]командний рядок. Через кілька секунд для аналізу шляху ви побачите щось подібне:

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

Видаліть виділений на даний момент елемент із d, виберіть CTRL+c


Ви також можете написати du -hs * | сортувати -хр. -s (підсумуйте) те саме, що --max-width = 0
rasmusx

5

ls -Sсортування за розміром. Потім для відображення розміру також ls -lSдається довгий ( -l), відсортований за розміром ( -S) дисплей. Я зазвичай додаю -hтеж, щоб полегшити читання, так ls -lhS,.


1
Ах, вибачте, це було незрозуміло з вашої посади. Ви хочете du, схоже, хтось це розмістив. @sehe: Залежить від вашого визначення реального - це відображення кількості місця, яке каталог використовує для зберігання. (Це просто не додавання розміру підкаталогів.) Це не випадкове число, і це не завжди 4KiB.
Танатос


0

Я думаю, я міг би зрозуміти, що ти хочеш зробити. Це дасть відсортований список усіх файлів та всіх каталогів, відсортований за розміром та розміром файлу вмісту в каталогах.

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n

Незважаючи на те, sehe запропонувала набагато простіше рішення. Я щодня дізнаюся щось нове!
дворак

Я не думаю, що використання duє варіантом, це дасть лише приблизний результат.
ztank1013,

0

[Розширена версія]
Це буде набагато швидше і точніше, ніж початкова версія нижче, і виведе суму всього розміру файлу поточного каталогу:

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

stat -c %sкоманда на файл буде повертати його розмір в байтах. trКоманда тут використовуються для подолання xargsобмежень команди ( по видимому , з запалом , щоб xargsце результат розщеплення на кілька рядків, порушуючи логіку моєї команди). Отже tr, піклується про заміну лінійного каналу +знаком (плюс). sedмає єдину мету - видалити останній +знак із отриманого рядка, щоб уникнути скарг на остаточну bcкоманду (основний калькулятор), яка, як завжди, робить математику.

Виступи: Я протестував його в декількох каталогах і понад ~ 150 000 файлів вгорі (поточна кількість файлів моєї Fedora 15 box), маючи те, на що я вважаю, це надзвичайний результат:

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

Про всяк випадок, якщо ви хочете порівняти з du -sb /командою, вона виведе орієнтовне використання диска в байтах ( -bопція)

# du -sb /
12684646920 /

Як я очікував, він трохи більший, ніж мій розрахунок команди, тому що duутиліта повертає виділений простір кожного файлу, а не фактичний спожитий простір.

[початкова версія]
Ви не можете скористатися duкомандою, якщо вам потрібно знати точний розмір вашої папки, оскільки (відповідно до цитованої сторінки) duоцінюється використання файлового простору. Отже, це призведе до неправильного результату, наближення (можливо, близького до розміру суми, але, швидше за все, більше, ніж фактичний розмір, який ви шукаєте).

Я думаю, що на ваше запитання можуть бути різні способи, але це моє:

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

Він знаходить усі файли під. каталог (зміна. будь-який каталог, який вам подобається), також включаються приховані файли і (використовуючи xargs) виводить їх імена в один рядок, а потім створює детальний список, використовуючи ls -l. Цей (іноді) величезний висновок передається в бік команди cut і -f5береться лише п’яте поле ( ), яке є розміром файлу в байтах, і знову проходить по відношенню до xargsякого знову створюється один рядок розмірів, розділений пробілами. Тепер виконайте магію sed, яка замінює кожне порожнє місце +знаком плюс ( ) і, нарешті, bc(основний калькулятор) робить математику.

Можливо, вам знадобиться додаткова настройка, і ви, можливо, lsнадто довго будете скаржитися на список аргументів.


якщо керівництво занадто велике, воно зависає тривалий час, спробуйте попрацювати над домашнім каталогом: p
Kit Ho

@KitHo добре, боюся, не існує простого і швидкого способу отримати точний результат без пошуку кожного окремого файлу та додавання його розміру, отже, команда лінь головним чином залежить від того, скільки файлів знаходиться під шуканим каталогом ... Але я вірю, що там є запас для поліпшень ... приємний виклик!
ztank1013,

@KitHo hey там, погляньте на розширену версію моєї відповіді ... і дайте мені знати, звичайно!
ztank1013,

0

Ще одне просте рішення.

$ for entry in $(ls); do du -s "$entry"; done | sort -n

результат буде виглядати так

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

зміна "du -s" на "du -sh" покаже людський читабельний розмір, але ми не зможемо сортувати за цим методом.


0

ви можете скористатись нижче, щоб перелічити файли за розміром du -h | сортувати -хр | більше або du -h - max-глибина = 0 * | сортувати -хр | більше


0

Я схильний використовувати дю простим способом.

du -sh */ | sort -n

Це дає мені уявлення про те, які каталоги займають найбільше місця. Потім я можу запустити більш точні пошуки пізніше.


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