Ответ 1
Если вам нужен "видимый размер" (то есть количество байтов в каждом файле), а не размер, занимаемый файлами на диске, используйте параметр -b
или --bytes
(если у вас есть система Linux с GNU coreutils):
% du -sbh <directory>
Когда я использую ls
или du
, я получаю объем дискового пространства, которое занимает каждый файл.
Мне нужна сумма всех данных в файлах и подкаталогах, которые я мог бы получить, если бы я открыл каждый файл и подсчитал байты. Бонусные очки, если я могу получить это без открытия каждого файла и подсчета.
Если вам нужен "видимый размер" (то есть количество байтов в каждом файле), а не размер, занимаемый файлами на диске, используйте параметр -b
или --bytes
(если у вас есть система Linux с GNU coreutils):
% du -sbh <directory>
Используйте du -sb
:
du -sb DIR
Необязательно добавьте параметр h
для более удобного вывода:
du -sbh DIR
cd в каталог, затем:
du -sh
FTW!
Изначально написал об этом здесь: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/
Просто альтернатива:
$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
grep -v '^ d' исключает каталоги.
stat "% s" формат дает вам фактическое количество байтов в файле.
find . -type f |
xargs stat --format=%s |
awk '{s+=$1} END {print s}'
Не забудьте заменить ваш любимый метод суммирования чисел.
Если вы используете busybox "du" в emebedded system, вы не можете получить точные байты с du, только килобайты, которые вы можете получить.
BusyBox v1.4.1 (2007-11-30 20:37:49 EST) multi-call binary
Usage: du [-aHLdclsxhmk] [FILE]...
Summarize disk space used for each FILE and/or directory.
Disk space is printed in units of 1024 bytes.
Options:
-a Show sizes of files in addition to directories
-H Follow symbolic links that are FILE command line args
-L Follow all symbolic links encountered
-d N Limit output to directories (and files with -a) of depth < N
-c Output a grand total
-l Count sizes many times if hard linked
-s Display only a total for each argument
-x Skip directories on different filesystems
-h Print sizes in human readable format (e.g., 1K 243M 2G )
-m Print sizes in megabytes
-k Print sizes in kilobytes(default)
Использование:
$ du -ckx <DIR> | grep total | awk '{print $1}'
Где <DIR> - каталог, который вы хотите проверить.
"-c" дает вам большие итоговые данные, которые извлекаются с помощью команды "grep total" команды, а счетчик в Kbytes извлекается командой awk.
Единственное предостережение здесь заключается в том, что если у вас есть подкаталог, содержащий текст "total", он также будет выплюнуть.
Это может помочь:
ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Вышеуказанная команда суммирует все файлы, оставляющие размер каталогов.
du
удобен, но find
полезен, если вы хотите рассчитать размер некоторых файлов (например, используя фильтр по расширению). Также обратите внимание, что find
сами могут печатать размер каждого файла в байтах. Чтобы вычислить общий размер, мы можем подключить команду dc
следующим образом:
find . -type f -printf "%s + " | dc -e0 -f- -ep
Здесь find
генерирует последовательность команд для dc
, например 123 + 456 + 11 +
.
Хотя, завершенная программа должна быть как 0 123 + 456 + 11 + p
(помните постфиксную нотацию).
Итак, чтобы получить завершенную программу, нам нужно положить 0
в стек перед выполнением последовательности из stdin и напечатать верхнее число после выполнения (команда 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 вместо этого (большинство пробелов необязательно).
Существует как минимум три способа получить "общую сумму всех данных в файлах и подкаталогах" в байтах, которые работают как в Linux/Unix, так и в Git Bash для Windows, перечисленных ниже, в порядке от самый медленный в среднем. Для вашей справки они выполнялись в корне довольно глубокой файловой системы (docroot
в установке Magento 2 Enterprise, содержащей 71 158 файлов в 30 027 каталогах).
1.
$ time find -type f -printf '%s\n' | awk '{ total += $1 }; END { print total" bytes" }'
748660546 bytes
real 0m0.221s
user 0m0.068s
sys 0m0.160s
2.
$ time echo `find -type f -print0 | xargs -0 stat --format=%s | awk '{total+=$1} END {print total}'` bytes
748660546 bytes
real 0m0.256s
user 0m0.164s
sys 0m0.196s
3.
$ time echo `find -type f -exec du -bc {} + | grep -P "\ttotal$" | cut -f1 | awk '{ total += $1 }; END { print total }'` bytes
748660546 bytes
real 0m0.553s
user 0m0.308s
sys 0m0.416s
Эти два также работают, но они полагаются на команды, которые не существуют в Git Bash для Windows:
1.
$ time echo `find -type f -printf "%s + " | dc -e0 -f- -ep` bytes
748660546 bytes
real 0m0.233s
user 0m0.116s
sys 0m0.176s
2.
$ time echo `find -type f -printf '%s\n' | paste -sd+ | bc` bytes
748660546 bytes
real 0m0.242s
user 0m0.104s
sys 0m0.152s
Если вам требуется только итоговое значение для текущего каталога, добавьте -maxdepth 1
в find
.
Обратите внимание, что некоторые из предложенных решений не возвращают точных результатов, поэтому я бы придерживался вышеперечисленных решений.
$ du -sbh
832M .
$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'
Total: 583772525
$ find . -type f | xargs stat --format=%s | awk '{s+=$1} END {print s}'
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
4390471
$ ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'
Total 968133
Для Win32 DOS вы можете:
c: > dir/s c:\directory\you\want
а предпоследняя строка расскажет вам, сколько байтов занимает файлы.
Я знаю, что это читает все файлы и каталоги, но в некоторых ситуациях работает быстрее.
Когда создается папка, многие файловые системы Linux выделяют 4096 байт для хранения некоторых метаданных о самой директории. Это пространство увеличивается на 4096 байт по мере роста каталога.
Командаdu (с опцией -b или без нее) принять в счетчик это пространство, поскольку вы можете видеть ввод:
mkdir test && du -b test
у вас будет результат 4096 байт для пустого каталога. Итак, если вы поместили 2 файла из 10000 байтов внутри каталога, общая сумма, заданная du-sb, составит 24096 байт.
Если вы внимательно прочитаете вопрос, это не то, что было задано. Вопроситель спросил:
общая сумма всех данных в файлах и подкаталогах, которые я получал бы, если бы я открыл каждый файл и подсчитал байты
что в приведенном выше примере должно быть 20000 байт, а не 24096.
Итак, правильный ответ IMHO может быть смесью ответа Nelson и hłddal для обработки имен файлов, содержащих пробелы:
find . -type f -print0 | xargs -0 stat --format=%s | awk '{s+=$1} END {print s}'