Як отримати узагальнені розміри каталогів та їх підкаталогів?


307

Скажімо, я хочу отримати розмір кожного каталогу файлової системи Linux. Під час використання ls -laя дійсно не отримую узагальненого розміру папок.

Якщо я використовую, dfя отримую розмір кожної змонтованої файлової системи, але це також не допомагає мені. І duя отримую розмір кожного підкаталогу та резюме всієї файлової системи.

Але я хочу мати лише узагальнений розмір кожного каталогу в папці ROOT файлової системи. Чи є якась команда для досягнення цього?


--totalПрапор був корисний для мене. Напр du -sh --total applications/*. askubuntu.com/a/465436/48214
Райан

Відповіді:


433

Це робить те, що ви шукаєте:

du -sh /*

Що це означає:

  • -s щоб дати лише загальний для кожного аргументу командного рядка.
  • -hдля читабельних для людини суфіксів, таких як Mмегабайти та Gгігабайти (необов’язково).
  • /*просто розширюється на всі каталоги (та файли) в /.

    Примітка: точкові файли не включені; запустіть, shopt -s dotglobщоб включити їх теж.

Також корисно сортування за розмірами:

du -sh /* | sort -h

Тут:

  • -hзабезпечує правильну sortінтерпретацію читабельних суфіксів.

8
Якщо у кореневому каталозі у вас є крапки-довідники, ви можете використовувати їх shopt -s dotglobдля включення до числа.
Філіпп

8
Це дуже корисно, тому що він простий і ви можете розмістити потрібний шлях замість /*, наприклад, ./для поточного каталогу або ./*для кожного елемента в поточному каталозі.
psur

3
@psur або ви можете використовувати ./*/лише папки та не всі елементи
перегляньте

7
Відсортована версія:du -sh /* | sort -h
Vu Anh

2
@ c1phr Якщо у вас sortнемає -h, вам також потрібно відключити її du, інакше сортування змішатиме кіло / мега / гігабайти. du -s /* | sort -nr.
Томас

79

Мені часто потрібно шукати найбільші каталоги, тому для отримання відсортованого списку, що містить 20 найбільших панів, я роблю це:

du -m /some/path | sort -nr | head -n 20

У цьому випадку розміри будуть повідомлятися в мегабайтах.


11
Ось спосіб зробити його більш читабельним du -sh / some / path | сортувати -хр | head -n 20
Xedecimal

6
@Xedecima проблема з використанням h полягає в тому, що сортування не знає, як поводитися з різними розмірами. Наприклад, 268K відсортовано вище, ніж 255М, і обидва відсортовано вище, ніж 2,7 г
хризанський

4
Аргумент -h (читабельний для людини) в команді 'sort' повинен правильно читати ці значення. Так само, як прапор Дю-е експортує їх. Залежно від того, що ти працюєш, я здогадуюсь.
Xedecimal

Працює в Ubuntu 16.04. Гарна порада.
SDsolar

sudo du -haxt 1G / | сортувати -хр | голова -30
відхилення

22

Мені подобається використовувати Ncdu для цього, ви можете використовувати курсор для навігації та деталізації в структурі каталогів, яка працює дуже добре.


Дивовижно. Ключові слова: du відповідає ncurses. Ви можете скористатися bоболонкою в каталозі.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

11

Існуючі відповіді дуже корисні, можливо, якийсь новачок (як я) знайде це також корисним.

  1. Дуже базовий цикл, але для мене це було гарним початком для деяких інших операцій, пов’язаних із розмірами:

    for each in $(ls) ; do du -hs "$each" ; done
    
  2. Дуже схожа на першу відповідь і майже такий самий результат, як і 1.), але мені знадобилося певний час, щоб зрозуміти різницю від * до ./*, якщо у підкаталозі:

    du -sh ./*
    

for eachне працює, оскільки додає символи консолі (напр. \033[) до списку папок
машинний вирок

@machineaddict не впевнений, що ти маєш на увазі. Я цим постійно користуюся, працює для мене просто чудово.
Мартін

спробуйте запустити свою команду, починаючи з for each. це не спрацює
машинобудівний вирок

Я запускаю команду точно так, як написано тут. починаючи з кожного. працює.
Мартін

7

Наступні duвиклики повинні працювати в системах BSD:

du -d 1 /

1
Мій du(Ubuntu 10.4) не має -dможливості. На якій системі ви працюєте?
Томас

У моєму openSUSE у нього також немає опції -d :(
2ndkauboy

Гаразд, тоді це лише варіант BSD (я перебуваю на OS X).
Філіпп

Права переносна комбінація опцій на BSD / * NIX є du -sk /*. Я -kсильно ненавиджу цей матеріал. Лінукс " -hповністю".
Dummy00001

в інших системах - її--max-depth
Вішну Кумар

4

Це непросто. duКоманда або показує файли і папки ( по замовчуванню) або тільки розміри всіх елементів , які ви вкажете в командному рядку (опція -s).

Щоб отримати найбільші елементи (файли і папки), відсортовані, з людськими читаними розмірами в Linux:

du -h | sort -h

Це поховає вас у тоні невеликих файлів. Ви можете позбутися від них за допомогою --threshold(1 Мб на моєму прикладі):

du --threshold=1M -h | sort -h

Перевага цієї команди полягає в тому, що вона включає приховані крапки з патчами (папки, які починаються з .).

Якщо ви просто хочете папки, вам потрібно скористатися, findале це може бути дуже, дуже повільно, оскільки duдоведеться сканувати багато папок кілька разів:

find . -type d -print0 | sort -z | xargs --null -I '{}' du -sh '{}' | sort -h

1
--threshold ^^^ ця опція не доступна на Linux
подарок

1
@podarok Доступний на OpenSUSE 13.2 Linux. Спробуйте знайти більш нову версію вашого дистрибутиву або складіть самостійно нову версію пакета.
Аарон Дігулла

Він не працює на Ubuntu LTS (14.04). Це найсвіжіший))
подарок

@podarok Яка версія GNU coreutils? Шахта 8,24.
Аарон Дігулла

1
Тренування може бути поганим терміном. Я думав про щось подібне, зроблене на цьому порту superuser.com/a/597173/121352, де ми скануємо вміст дисків один раз на відображення, а потім продовжуємо використовувати дані з цього відображення, а не натискати диск знову.
Геннес

1

Зауважте, що ви не можете порівнювати каталоги з duрізними системами / машинами, не переконуючись, обидва мають однаковий розмір файлової системи. Це може бути розраховано, якщо ви rsync деякі файли з машини Linux на NAS і хочете самостійно порівняти синхронізований каталог. Можливо, ви отримаєте різні результати duчерез різні розміри блоків ....


0

Ви також можете перевірити xdiskusage . Дасть вам ту саму інформацію, але показану графічно, плюс дозволяє деталізувати (дуже корисно). Є й інші подібні утиліти для KDE і навіть Windows.


0

Ви можете використовувати lsспільно з awk:

ls -al * | awk 'BEGIN {tot=0;} {tot = tot + $5;} END {printf ("%.2fMb\n",tot/1024/1024);}'

Вихід з lsтрубопроводу до awk. awkпочинає обробку даних. Стандартний роздільник - це простір. Змінна сума totініціалізується на нуль; наступне твердження виконується для кожного рядка / рядка, що виводиться ls. Це просто прирости totз розміром. $5означає п'яту колонку (виводиться ls). Наприкінці ми ділимо на (1024 * 1024) на суму в мегабайтах.

Якщо ви перетворили це в сценарій або функцію (.bashrc), ви також можете використовувати його, щоб отримати розмір певних підмножин каталогів, відповідно до файлів.

Якщо ви хочете отримати інформацію про систему, kdirstatможливо, стане у нагоді!


Я погоджуюся, що можна розширити цей приклад і зробити такі трюки, як отримання розміру "певних підмножин каталогів відповідно до файлів" тощо; це може здатися гарною відправною точкою. Тим не менш, це рішення є помилковим з самого початку. Кожному користувачеві, який хотів би скористатися цим методом, рекомендую прочитати відповіді та коментарі до цього питання , а також статтю, зв'язану там . Я не кажу, що ти взагалі не можеш це зробити. Знайте обмеження, ось і все.
Каміль Маціоровський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.