Как определить общий размер каталога (папки) из командной строки?

Существует ли простая команда для отображения общего совокупного размера (использования диска) всех файлов в каталоге (папке)?

Я пробовал это, и они не делают то, что я хочу:

  • ls -l, который отображает только размер отдельных файлов в каталоге, ни
  • df -h, который отображает только свободное и использованное пространство на моих дисках.

14 ответов

Решение

Команда du "суммирует использование диска каждого ФАЙЛА, рекурсивно для каталогов", например,

du -hs /path/to/directory
  • -h чтобы получить числа "читабельные", например, получить 140M вместо 143260 (размер в килобайтах)
  • -s для справки (в противном случае вы получите не только размер папки, но и все в папке отдельно)

Как вы используете -h Вы можете сортировать читабельные значения человека, используя

du -h | sort -h

-h флаг на sort будет учитывать "Размер для чтения человеком".


Если вы хотите избежать рекурсивного перечисления всех файлов и каталогов, вы можете указать --max-depth параметр для ограничения количества отображаемых элементов. Наиболее часто, --max-depth=1

du -h --max-depth=1 /path/to/directory

Недавно я нашел отличный интерактивный инструмент на основе ncurses, который быстро дает вам обзор размеров каталогов. Искал такой инструмент годами.

  • быстро развернуть иерархию файлов
  • Вы можете удалить, например, огромные временные файлы изнутри инструмента
  • очень быстро

Думайте об этом как о баобабе для командной строки:

apt-get install ncdu

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

du -hsc *

Ниже приводится то, что я использую для печати общего размера, папки и размера файла:

$ du -sch /home/vivek/* | sort -rh

подробности

 ------------------------------------------------------------
   -c, --total
          produce a grand total
   -h, --human-readable
          print sizes in human readable format (e.g., 1K 234M 2G)
   -s, --summarize
          display only a total for each argument
 -------------------------------------------------------------
   -h, --human-numeric-sort
          compare human readable numbers (e.g., 2K 1G)
   -r, --reverse
          reverse the result of comparisons

Выход

 70M    total
 69M    /home/vivek/Downloads/gatling-charts-highcharts-bundle-2.2.2/lib
992K    /home/vivek/Downloads/gatling-charts-highcharts-bundle-2.2.2/results
292K    /home/vivek/Downloads/gatling-charts-highcharts-bundle-2.2.2/target
 52K    /home/vivek/Downloads/gatling-charts-highcharts-bundle-2.2.2/user-files

Наслаждайтесь!

du foldername

Больше информации об этой команде здесь

tree Еще одна полезная команда для этой работы:

Просто установите его через sudo apt-get install tree и введите следующее:

tree --du -h /path/to/directory
...
...

33.7M used in 0 directories, 25 files

Из дерева человек:

-h    Print  the size of each file but in a more human readable way, e.g. appending a size letter for kilo‐
      bytes (K), megabytes (M), gigabytes (G), terabytes (T), petabytes (P) and exabytes (E).

--du  For each directory report its size as the accumulation of sizes of all its files and  sub-directories
      (and their files, and so on). The total amount of used space is also given in the final report (like
      the 'du -c' command.)

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

      du -had1 dir/

(может быть, как "у вас был 1")

  • -h: удобочитаемые размеры
  • -a: показывать файлы, а не только каталоги
  • -d1: показывать итоги только на глубине 1, т.е. содержимое текущего каталога

Для текущего каталога аргумент каталога можно не указывать.

du -sh dir/*имеет тот же эффект, но не показывает скрытые файлы и каталоги из-за подстановки оболочки.

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

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

Источник

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

  • Время от времени, du Вывод может вводить в заблуждение, поскольку он сообщает о пространстве, выделенном файловой системой, которое может отличаться от суммы размеров отдельных файлов. Обычно файловая система выделяет 4096 байт для файла, даже если вы сохранили в нем только один символ!

  • Различия в выходной мощности обусловлены мощностью 2 и мощностью 10 единиц. -h переключиться на du делит количество байтов на 2^10 (1024), 2^20 (1048576) и т. д., чтобы получить удобочитаемый вывод. Многие люди могут более привыкнуть видеть силу 10 (например, 1K = 1000, 1M = 1000000) и быть удивлены результатом.

Чтобы найти общую сумму размеров всех файлов в каталоге, в байтах, выполните:

find <dir> -ls | awk '{sum += $7} END {print sum}'

Пример:

$ du -s -B 1
255729664

$ find .  -ls | awk '{sum += $7} END {print sum}'
249008169

Я обусловлен командой, которая имеет псевдоним ls -alF. Внизу просто отсутствует количество файлов и размер файлов. я играл с и treeно не смог получить нужные мне суммы. Так что я создал, чтобы сделать это для меня.

На вашем месте следующее:

      lll () {
    ls -alF "$@"
    arr=($(ls -alF "$@" | awk '{TOTAL+=$5} END {print NR, TOTAL}'))
    printf " \33[1;31m ${arr[0]}\33[m line(s).  "
    printf "Total size: \33[1;31m ${arr[1]}\33[m\n"
#    printf "Total size: \33[1;31m $(BytesToHuman <<< ${arr[1]})\33[m\n"
}

Сохраните файл и используйте его ресурсы (или вы можете перезапустить терминал).


Пример вывода

Хорошая вещь о llвывод - это цвета. Это поддерживается с lllно теряется при использовании findили же du:


TL;DR

Бонусная функция, которую вы можете добавить к ~/.bashrcназывается BytesToHuman(). Это делает то, что ожидает большинство пользователей консолей, конвертируя большие числа в MiB, GiB и т. д.:

      function BytesToHuman() {

    # https://unix.stackexchange.com/questions/44040/a-standard-tool-to-convert-a-byte-count-into-human-kib-mib-etc-like-du-ls1/259254#259254

    read StdIn

    b=${StdIn:-0}; d=''; s=0; S=(Bytes {K,M,G,T,E,P,Y,Z}iB)
    while ((b > 1024)); do
        d="$(printf ".%02d" $((b % 1024 * 100 / 1024)))"
        b=$((b / 1024))
        let s++
    done
    echo "$b$d ${S[$s]}"

} # BytesToHuman ()

Затем переверните комментарий между двумя строками в lll ()функция выглядит следующим образом:

      #    printf "Total size: \33[1;31m ${arr[1]}\33[m\n"
    printf "Total size: \33[1;31m $(BytesToHuman <<< ${arr[1]})\33[m\n"

Теперь ваш вывод выглядит так:

Как всегда, не забудьте повторно использовать . ~/.bashrcвсякий раз, когда вносятся изменения. (Или перезагрузите терминал, конечно)

PS: Две недели самоизоляции наконец-то дали мне время поработать над этой пятилетней целью.

Если в вашем нужном каталоге много подкаталогов, используйте следующее:

$ cd ~/your/target/directory
$ du -csh 

-c, - Итого произведем общий итог
-s, --summarize отображать только сумму для каждого аргумента
-ч, - читаемые человеком размеры печати в удобочитаемом формате (например, 1K 234M 2G)

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

du /foldername стандартная команда для определения размера папки. Лучше всего найти варианты, прочитав справочную страницу:

man du

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

Используйте только размер каталога в удобочитаемом формате:

du -hs directoryname

Это, вероятно, не в правильном разделе, но из командной строки вы можете попробовать:

ls -sh filename

-s это размер, а -h читается человеком.

использование -l показать на ls список, как показано ниже:

ls -shl

Лучшее, на мой взгляд, следующее:

du -h directory_name | tail -n1

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

Я должен добавить, что если размер папки большой, то du занимает больше времени. Вы должны быть терпеливы, чтобы эта команда сработала. Как и любую другую команду Unix, вы можете узнать общее время этого процесса, используя time перед этой командой:

time du -h directory_name | tail -n1
Другие вопросы по тегам