Как получить суммарные размеры каталогов и их подкаталогов?

307

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

Если я использую, dfя получаю размер каждой смонтированной файловой системы, но это также не помогает мне. И duя получаю размер каждого подкаталога и сводку всей файловой системы.

Но я хочу иметь только суммарный размер каждого каталога в папке ROOT файловой системы. Есть ли команда для этого?

2ndkauboy
источник
--totalФлаг был полезен для меня. Например du -sh --total applications/*. askubuntu.com/a/465436/48214
Райан,

Ответы:

432

Это делает то, что вы ищете:

du -sh /*

Что это значит:

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

    Примечание: точечные файлы не включены; бежать, shopt -s dotglobчтобы включить их тоже.

Также полезна сортировка по размеру:

du -sh /* | sort -h

Вот:

  • -hгарантирует, что sortинтерпретирует удобочитаемые суффиксы правильно.
Томас
источник
8
Если у вас есть точечные каталоги в корневом каталоге, вы можете использовать их shopt -s dotglobдля включения в счетчик.
Филипп
8
Это очень полезно, потому что это просто, и вы можете указать, какой путь вы хотите вместо /*, например, ./для текущего каталога или ./*для каждого элемента в текущем каталоге.
псур
3
@psur или вы можете использовать, ./*/чтобы получить только подпапки, а не все элементы
relascope
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 | сортировать -hr | голова -n 20
Xedecimal
6
@Xedecima проблема с использованием h заключается в том, что она не знает, как обрабатывать разные размеры. Например, 268K отсортировано выше, чем 255M, и оба отсортированы выше, чем 2.7G
chrisan
4
Аргумент -h (человек читаемый) в команде 'sort' должен правильно прочитать эти значения. Так же, как флаг du's -h экспортирует их. В зависимости от того, что вы бежите, я думаю.
Xedecimal
Работает в Ubuntu 16.04. Хороший совет.
SDsolar
sudo du -haxt 1G / | сортировать -hr | голова -30
девиант
22

Мне нравится использовать Ncdu для этого, вы можете использовать курсор для навигации и просмотра структуры каталогов, это работает очень хорошо.

BuddhaLincoln
источник
Потрясающие. Ключевые слова: дю встречает курсантов. Вы можете использовать, bчтобы зайти в оболочку в каталоге.
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
11

Существующие ответы очень полезны, может быть, некоторые новички (такие как я) тоже найдут это полезным.

  1. Очень простой цикл, но для меня это было хорошее начало для некоторых других операций, связанных с размером:

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

    du -sh ./*
    
Мартин
источник
for eachне работает, так как добавляет символы консоли (например \033[) в список папок
machineaddict
@machineaddict не уверен, что вы имеете в виду. Я использую это все время, у меня работает просто отлично.
Мартин
попробуйте запустить команду, начиная с for each. это не будет работать
machineaddict
я запускаю команду точно так, как написано здесь. начиная с каждого. работает.
Мартин
7

Следующий duвызов должен работать в системах BSD:

du -d 1 /
Philipp
источник
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
podarok
1
@podarok Это доступно в OpenSUSE 13.2 Linux. Попробуйте найти более свежую версию своего дистрибутива или скомпилируйте более новую версию пакета самостоятельно.
Аарон Дигулла
Это не работает на Ubuntu LTS (14.04). Это самый последний))
подарок
@podarok Какая версия GNU coreutils? Мой 8,24.
Аарон Дигулла
1
Кэширование могло бы быть плохим термином. Я думал о чем-то вроде этого в этом порту superuser.com/a/597173/121352, где мы сканируем содержимое дисков один раз в сопоставление, а затем продолжаем использовать данные из этого сопоставления, а не снова ударять по диску.
Хеннес
1

Имейте в виду, что вы не можете сравнивать каталоги duна разных системах / машинах, не будучи уверенными, что оба разделяют один и тот же размер блока файловой системы. Это может иметь значение, если вы пересылаете некоторые файлы с Linux-машины на NAS и хотите сравнить синхронизированный каталог самостоятельно. Вы можете получить разные результаты duиз-за разных размеров блоков ....

Джимми Кёртинг
источник
0

Вы также можете проверить xdiskusage . Предоставит вам ту же информацию, но показанную графически, плюс позволит развернуть (очень полезно). Есть и другие подобные утилиты для KDE и даже Windows.

sleske
источник
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может пригодиться!

JM Stoorvogel
источник
Я согласен, что можно расширить этот пример и делать такие трюки, как получение размера «определенных подмножеств каталогов в соответствии с типами файлов» и т. Д .; это может показаться хорошей отправной точкой. Тем не менее, это решение ошибочно с самого начала. Каждому пользователю, который хотел бы использовать этот метод, я рекомендую прочитать ответы и комментарии к этому вопросу, а также статью, на которую есть ссылки . Я не говорю, что вы не можете сделать это вообще. Знайте ограничения, вот и все.
Камиль Мачоровский