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

1066

Я попытался получить размер каталога (содержащего каталоги и подкаталоги) с помощью lsкоманды с параметром l. Кажется, что это работает для файлов ( ls -l file name), но если я пытаюсь получить размер каталога (например, ls -l /home), я получаю только 4096 байт, хотя в целом он намного больше.

Абдул Аль Хазред
источник
18
1) Строго говоря, вы не можете. В Linux есть каталоги, а не папки. 2) Существует разница между размером каталога (который является специальным файлом, содержащим иноды, указывающие на другие файлы) и размером содержимого этого каталога. Как уже отмечали другие, команда du предоставляет последнее, что, как вам кажется, вы хотите.
jamesqf
11
поскольку вы, кажется, новичок, я просто укажу полезную -hопцию, которую вы можете добавить к -lопции (то есть ls -lh), чтобы получить размеры файлов, которые будут распечатаны в удобной для человека форме, такой как 1.1M вместо 1130301. "h «в du -hsкоманде, которую @sam дал в качестве ответа на ваш вопрос о каталогах, также означает« читабельный человеком », и в нем также df -hуказано, что в человеке читается количество использованного и свободного места на диске.
msouth

Ответы:

1492

du -sh file_path

объяснение

  • du( d isc u sage) команда оценивает использование пространства file_path
  • Варианты -sh(от man du):

      -s, --summarize
             display only a total for each argument
    
      -h, --human-readable
             print sizes in human readable format (e.g., 1K 234M 2G)
    

    Чтобы проверить несколько каталогов и увидеть общее количество, используйте du -sch:

      -c, --total
             produce a grand total
    
Сэм
источник
44
... если у вас нет
жестких
15
Это тот ответ, который мне нравится <3 Это краткое изложение и своего рода введение в команду, duа также вы даете возможность искать более подробную информацию man du...
Подсказка для Unix-подобных производителей: в следующий раз, просто сначала выполните команду «diskusage», или, возможно, даже «использование диска» ... затем ярлык ...;)
jave.web
Это очень хорошо работает, find например, для подсчета количества места в определенных подкаталогах на текущем пути: $ find . -type d -name "node_modules" -prune -exec du -sh {} \;
Алексей Глуховцев
321

Просто используйте duкоманду:

du -sh -- *

даст вам совокупное использование диска всех не скрытых каталогов, файлов и т. д. в текущем каталоге в удобочитаемом формате.

Вы можете использовать dfкоманду, чтобы узнать свободное место в файловой системе, содержащей каталог:

df -h .
пацифист
источник
4
du -sh *начинает выдавать ошибки «неизвестная опция», если любой из файлов в этом каталоге начинается с тире. Безопаснее сделатьdu -sh -- *
mpen
1
du -sh *не показывает использование в памяти скрытых папок
Прашант Прабхакар Сингх
4
du -sh -- * .*включить точечные файлы. Это полезно для включения .git, например, большого каталога. В качестве альтернативы в zsh вы можете использовать setopt globdotsфайлы точек по умолчанию.
cbarrick
1
Что делает --? Я знаю, что это применимо к встроенным средствам оболочки для завершения аргументов параметров, но duне является встроенным, и я не вижу документирования этого использования для du: linux.die.net/man/1/du
flow2k
Иногда вы захотите добавить -b( --apparent-size)
elig
196

duтвой друг. Если вы просто хотите узнать общий размер каталога, перейдите в него и запустите:

du -hs

Если вы также хотите знать, какие подпапки занимают место на диске ?! Вы можете расширить эту команду до:

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

который даст вам размер всех подпапок (уровень 1). Вывод будет отсортирован (самая большая папка сверху).

Chrispie
источник
Похоже, что в некоторых (возможно, более старых?) Версиях linux сортировка не имеет переключателя h, и поэтому следующая лучшая команда, которую я смог найти, это: du -c --max-deep = 1 | sort
-rn
@richhallstoke, если вы используете ncduфайлы, по умолчанию сортируются по убыванию.
Armfoot
3
+1 для "| sort -hr"
afranques
67

duможет быть сложным в использовании, так как вы должны передать 100 аргументов, чтобы получить достойный результат. И выяснить размер скрытых папок еще сложнее.

Сделайте свою жизнь легкой и удобнойncdu .

ncdu

Вы получаете по каждой папке резюме, которые легко просматриваются.

Teque5
источник
9
Это должен быть правильный ответ, по крайней мере, для тех, кто может установить программное обеспечение в системе. К сожалению, я не думаю, что большинство людей прокрутят достаточно далеко, чтобы увидеть это.
DavidR
@ RickyNotaro-Garcia Нет, это игнорирует скрытые объекты и висит на больших каталогах. Вполне возможно, что есть правильное решение с дюжиной труб, но зачем тратить свою жизнь.
Teque5
@ RickyNotaro-Garcia Прочитайте весь мой комментарий: ваша попытка игнорирует скрытые объекты и висит на больших каталогах.
Teque5
2
ncduотлично, я всегда ищу эту команду, когда забываю. Это быстро, легко ориентироваться и помогает легко находить большие папки. К вашему сведению, он также доступен для macOS и, вероятно, для всех компьютеров с Linux.
Лукас
..и вы можете удалять папки прямо из ncduнажав dклавишу
ccpizza
32

Другие упоминали du, но я также хотел бы упомянуть Ncdu, который является версией ncurses duи обеспечивает интерактивность: вы можете непосредственно изучить иерархию каталогов и увидеть размеры подкаталогов.

Tblue
источник
26

Команда duпоказывает использование файла диском.

-hОпция показывает результаты в удобочитаемой форме (например, 4k, 5M, 3G).

du -h (file name)
jackotonye
источник
22

Во всех приведенных выше примерах будет указан размер данных на диске (т. Е. Объем дискового пространства, используемого конкретным файлом, который обычно больше, чем фактический размер файла). В некоторых ситуациях они не дают точного отчета, если данные на самом деле не хранятся на этом конкретном диске и существуют только ссылки на иноды.

В вашем примере вы использовали ls -l для одного файла, который будет возвращать фактический размер файла, а НЕ его размер на диске.

Если вы хотите узнать фактические размеры файлов, добавьте опцию -b в du.

du -csbh .
Энди Фостер
источник
Да. Я использую sdfs, который сжимает и выводит файлы, поэтому я не мог понять, почему он сообщает о таких низких цифрах. Действительный размер файлов с помощью ls можно найти с помощью: du -b
Райан Шиллингтон,
15

лично я думаю, что это лучше, если вы не хотите использовать ncdu

# du -sh ./*
ConnerMan
источник
14
df -h .; du -sh -- * | sort -hr

Это показывает, сколько дискового пространства осталось на текущем диске, а затем говорит, сколько занимает каждый файл / каталог. например,

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb2       206G  167G   29G  86% /
115M    node_modules
2.1M    examples
68K     src
4.0K    webpack.config.js
4.0K    README.md
4.0K    package.json
mpen
источник
К вашему сведению, кажется, что сообщается о размере на диске. то есть он, вероятно, будет дополнен до ближайшего 4KB.
mpen
9

найти все файлы в текущем каталоге рекурсивно и суммировать их размер:

find -type f -print0 | xargs -0 stat --print='%s\n' | awk '{total+=$1} END {print total}'
Леон Чанг
источник
Я бы использовал -not -type dдля суммирования не только размеры обычных файлов ( -type f), но и размеры символических ссылок и так далее.
anton_rh
Это замечательно, потому что вы не получаете накладные расходы, необходимые для хранения файлов, а только размер самих файлов.
bballdave025
9

Вот функция для вашего .bash_aliases

# du with mount exclude and sort
function dusort () {
    DIR=$(echo $1 | sed 's#\/$##')
    du -scxh $(mount | awk '{print $3}' | sort | uniq \
     | sed 's#/# --  exclude=/#') $DIR/* | sort -h
}

образец вывода:

$ dusort /
...
0       /mnt  
0       /sbin
0       /srv
4,0K    /tmp
728K    /home
23M     /etc
169M    /boot  
528M    /root
1,4G    /usr
3,3G    /var
4,3G    /opt
9,6G    total

для подкаталогов:

$ dusort .
$ dusort /var/log/
feldversuch
источник
7

Еще один вариант:

du -h --max-dep=1
0x8BADF00D
источник
6

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

Если файловая система является сжимаемой, то duможет выводить даже меньшее число, чем общий размер всех файлов, поскольку файлы могут быть внутренне сжаты файловой системой, и поэтому они занимают меньше места на носителе, чем просто несжатая информация, которую они содержат. То же самое, если есть редкие файлы.

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

Чтобы получить простой общий размер всех файлов в каталоге, можно использовать следующее однострочное выражение оболочки (при условии, что система GNU):

find . ! -type d -print0 | xargs -r0 stat -c %s | paste -sd+ - | bc

или даже короче:

find . ! -type d -printf '%s\n' | paste -sd+ - | bc

Он просто суммирует размеры всех не-каталогов файлов в каталоге (и его подкаталогах рекурсивно) один за другим. Обратите внимание, что для символических ссылок он сообщает размер символической ссылки (а не файла, на который указывает символическая ссылка).

anton_rh
источник
5

Вы можете использовать

du -sh directory/

а также

du -sh filename

знать пространство, занимаемое папкой или файлом.

df -h

покажет использование диска в удобочитаемом формате -h делает это.

Существует также программа на основе графического интерфейса Disk Usage Analyzer.

arupgsh
источник
5

Вот скрипт POSIX, который будет работать с:

  • Файл
  • файлы
  • Каталог
  • Справочники
#!/bin/sh
ls -ARgo "$@" | awk '{q += $3} END {print q}'

Источник

Стивен Пенни
источник