Как определить общий размер каталога (папки) из командной строки?
Существует ли простая команда для отображения общего совокупного размера (использования диска) всех файлов в каталоге (папке)?
Я пробовал это, и они не делают то, что я хочу:
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
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