Когда я использую ls
или du
, я получаю объем дискового пространства, который занимает каждый файл.
Мне нужна общая сумма всех данных в файлах и подкаталогах, которые я получил бы, если бы открыл каждый файл и подсчитал байты. Бонусные баллы, если я смогу получить это, не открывая каждый файл и не подсчитывая.
ls
фактически показывает количество байтов в каждом файле, а не объем дискового пространства. Этого достаточно для ваших нужд?du
нельзя использовать для ответа на этот вопрос. Он показывает объем дискового пространства, который каталог занимает на диске (данные файлов плюс размер метаинформации вспомогательной файловой системы). Результатdu
может быть даже меньше, чем общий размер всех файлов. Это может произойти, если файловая система может хранить сжатые данные на диске или если используются жесткие ссылки. Правильные ответы основаны наls
иfind
. См. Ответы Нельсона и bytepan здесь, или этот ответ: unix.stackexchange.com/a/471061/152606Ответы:
Если вам нужен «видимый размер» (то есть количество байтов в каждом файле), а не размер, занимаемый файлами на диске, используйте параметр
-b
или--bytes
(если у вас есть система Linux с GNU coreutils ):источник
du -shb
(как было предложено в этом ответе)-b
настройка, похоже, отменяет-h
настройку.du -sh --apparent-size /dir/
Использование
du -sb
:При желании добавьте
h
опцию для более удобного вывода:источник
brew install coreutils
. Он будет доступен как командаgdu
.ls
->file.gz hardlink-to-file.gz
.stat -c %s file.gz
->9657212
.stat -c %s hardlink-to-file.gz
->9657212
.du -sb
->9661308
. Это определенно не общий размер содержимого, а размер, который каталог занимает на диске.cd в каталог, затем:
ftw!
Первоначально об этом писали здесь: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/
источник
-L
опцию поdu
символическим ссылкам.Просто альтернатива:
grep -v '^d'
исключит каталоги.источник
ls -lR | grep '.png$' | awk '{total += $5} END {print "Total:", total/1024/1024, "MB"}'
du
этого решения действительно подсчитывает общий размер всех данных в файлах, как если бы они были открыты один за другим, и их байты были подсчитаны. Но да, добавление-A
параметра также необходимо для подсчета скрытых файлов.Формат stat "% s" дает вам фактическое количество байтов в файле.
Не стесняйтесь использовать свой любимый метод суммирования чисел .
источник
find -print0
иxargs -0
необходимы для имен файлов с пробелами. OS X хочетstat -f %z
.du
отчеты.)du
утилиту, этот ответ правильный. Здесь очень похоже на ответ: unix.stackexchange.com/a/471061/152606 . Но я бы также использовал! -type d
вместо-type f
подсчета символических ссылок (размер самой символической ссылки (обычно несколько байтов), а не размер файла, на который она указывает).Если вы используете "du" busybox в emebedded системе, вы не можете получить точные байты с помощью du, вы можете получить только килобайты.
источник
При создании папки многие файловые системы Linux выделяют 4096 байт для хранения некоторых метаданных о самом каталоге. Это пространство увеличивается кратно 4096 байтам по мере роста каталога.
Команда du (с параметром -b или без него) учитывает это пространство , как вы можете видеть, набрав:
у вас будет результат 4096 байт для пустого каталога. Итак, если вы поместите в каталог 2 файла по 10000 байт, общая сумма, указанная du -sb , составит 24096 байт.
Если вы внимательно прочитаете вопрос, то не об этом. Спрашивающий спросил:
что в приведенном выше примере должно быть 20000 байт, а не 24096.
Итак, правильный ответ IMHO может быть смесью ответа Нельсона и предложения hlovdal для обработки имен файлов, содержащих пробелы:
источник
Существует как минимум три способа получить «общую сумму всех данных в файлах и подкаталогах» в байтах, которые работают как в Linux / Unix, так и в Git Bash для Windows, и перечислены ниже в порядке от самого быстрого к среднему. Для справки, они выполнялись в корне довольно глубокой файловой системы (
docroot
в установке Magento 2 Enterprise, содержащей 71 158 файлов в 30 027 каталогах).1.
2.
3.
Эти два также работают, но они полагаются на команды, которых нет в Git Bash для Windows:
1.
2.
Если вам нужна только сумма для текущего каталога, добавьте
-maxdepth 1
кfind
.Обратите внимание, что некоторые из предложенных решений не возвращают точных результатов, поэтому я бы предпочел использовать приведенные выше решения.
источник
dc
является частьюbc
пакета, поэтому дляdc
его получения необходимо установитьbc
.Для Win32 DOS вы можете:
c:> каталог / sc: \ каталог \ вы \ хотите
а в предпоследней строке будет указано, сколько байтов занимают файлы.
Я знаю, что это читает все файлы и каталоги, но в некоторых ситуациях работает быстрее.
источник
du
удобно, ноfind
полезно в том случае, если вы хотите рассчитать размер только некоторых файлов (например, используя фильтр по расширению). Также обратите внимание, чтоfind
сами могут распечатать размер каждого файла в байтах. Чтобы рассчитать общий размер, мы можем подключитьdc
команду следующим образом:Здесь
find
формируется последовательность команд дляdc
лайка123 + 456 + 11 +
. Хотя, готовая программа должна быть похожей0 123 + 456 + 11 + p
(вспомним постфиксную нотацию).Итак, чтобы получить законченную программу, нам нужно поместить ее
0
в стек перед выполнением последовательности из стандартного ввода-вывода и вывести верхнее число после выполнения (p
команда в конце). Мы достигаем этого с помощьюdc
опций:-e0
просто ярлык для того,-e '0'
чтобы положить его0
в стек,-f-
предназначен для чтения и выполнения команд из stdin (сгенерированныхfind
здесь),-ep
предназначен для печати результата (-e 'p'
).Чтобы напечатать размер в MiB, как
284.06 MiB
мы можем использовать-e '2 k 1024 / 1024 / n [ MiB] p'
вместо этого в пункте 3 (большинство пробелов необязательны).источник
Это может помочь:
Приведенная выше команда суммирует все файлы, покидающие размер каталогов.
источник
-A
необходимо добавить параметр вls
.Использование:
Где <DIR> - это каталог, который вы хотите проверить.
'-C' дает вам общие данные, которые извлекаются с помощью части команды 'grep total', а количество в килобайтах извлекается с помощью команды awk.
Единственное предостережение: если у вас есть подкаталог, содержащий текст «total», он также будет выплевывать.
источник