it-swarm-ru.tech

Как узнать размер каталога Linux или Mac OS X из командной строки?

Какую команду я использую, чтобы найти размер всех файлов (рекурсивно) в каталоге Linux или Mac OS X?

70
Daryl Spitzer

Версия BSD du, используемая в OS X, сообщает о размере с 512-байтовыми блоками - размеры по существу округлены до следующего 512-байтового значения. Это говорит о том, что место на диске больше, чем объем данных. Если у вас много маленьких файлов, разница может быть большой.

Вот пример.

Это значение с обычной переменной du. Это в 512-байтовых блоках:

$ du -s
248   .

Флаг -h приводит к более читаемому числу в килобайтах. Как и ожидалось, это половина числа 512-байтовых блоков:

$ du -hs
124K  .

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

$ find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
60527

Это значение в точности совпадает с числом, сообщенным в окне «Информация» в Finder. (В этом наборе файлов нет никаких странных разветвлений или xattrs.) Это значительно меньше значения, сообщаемого du.

Вот как это работает: он получает список всех файлов и передает их ls -l; затем awk используется для подсчета байтов. Флаг -type f установлен так, что только файлы (а не каталоги) отправляются в ls. Без этого флага он также отправит имена каталогов в ls, и каждый файл будет указан дважды: один раз как отдельный файл и один раз как элемент в каталоге.

Версия GNU du может давать значения в реальных байтах вместо блоков. К сожалению, BSD-версия du не так гибка.

79
wch

Показать размер одного файла

du -h path_to_a_file

Покажите размер содержимого каталога, каждого подкаталога и каждого отдельного файла:

du -h path_to_a_directory

Показать размер содержимого каталога:

du -sh path_to_a_directory

75
Daryl Spitzer

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

find . -type f -print0 | xargs -0 stat -f%z | awk '{b+=$1} END {print b}'

код терминала выше (im на OSX 10.6) предлагает для меня лучший результат и работает быстрее, чем "find ... -exec"

быстрый тест

time find . -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}'
4744010970

real    0m0.086s
user    0m0.029s
sys 0m0.073s

time find . -type f -exec ls -l {} \; | awk '{sum += $5} END {print sum}'
4744010970

real    0m18.515s
user    0m2.929s
sys 0m9.339s
9
Acid

Вы можете использовать du -ah ., который рекурсивно отображает размеры всех файлов и каталогов.

Это можно комбинировать с sort, так что вы увидите 20 самых больших каталогов в текущей папке:

du -ah . | sort -rh | head -20

Примечание. Параметр -h для sort недоступен в OSX/BSD, поэтому вам необходимо установить sort из coreutils (например, через brew) и применить путь к корзине PATH, например,.

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

В противном случае используйте:

du -a . | sort -rn | head -20
5
kenorb

Я объединил все ваши приложения и объединил их с удобочитаемым выводом:

#!/bin/sh
find $1 -type f -print0 | xargs -0 stat -f'%z' | awk '{b+=$1} END {print b}' | awk '{ sum=$1 ; hum[1024**3]="Gb";hum[1024**2]="Mb";hum[1024]="Kb"; for (x=1024**3; x>=1024; x/=1024){ if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x];break } }}'

Ссылка на Gist: https://Gist.github.com/mlegenhausen/9365461

2
malte