Общий размер содержимого всех файлов в каталоге

Когда я использую ls или du, я получаю объем дискового пространства, которое занимает каждый файл.

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

Ответ 1

Если вам нужен "видимый размер" (то есть количество байтов в каждом файле), а не размер, занимаемый файлами на диске, используйте параметр -b или --bytes (если у вас есть система Linux с GNU coreutils):

% du -sbh <directory>

Ответ 2

Используйте du -sb:

du -sb DIR

Необязательно добавьте параметр h для более удобного вывода:

du -sbh DIR

Ответ 4

Просто альтернатива:

$ ls -lR | grep -v '^d' | awk '{total += $5} END {print "Total:", total}'

grep -v '^ d' исключает каталоги.

Ответ 5

stat "% s" формат дает вам фактическое количество байтов в файле.

 find . -type f |
 xargs stat --format=%s |
 awk '{s+=$1} END {print s}'

Не забудьте заменить ваш любимый метод суммирования чисел.

Ответ 6

Если вы используете 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)

Ответ 7

Использование:

$ du -ckx <DIR> | grep total | awk '{print $1}'

Где <DIR> - каталог, который вы хотите проверить.

"-c" дает вам большие итоговые данные, которые извлекаются с помощью команды "grep total" команды, а счетчик в Kbytes извлекается командой awk.

Единственное предостережение здесь заключается в том, что если у вас есть подкаталог, содержащий текст "total", он также будет выплюнуть.

Ответ 8

Это может помочь:

ls -l| grep -v '^d'| awk '{total = total + $5} END {print "Total" , total}'

Вышеуказанная команда суммирует все файлы, оставляющие размер каталогов.

Ответ 9

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 вместо этого (большинство пробелов необязательно).

Ответ 10

Существует как минимум три способа получить "общую сумму всех данных в файлах и подкаталогах" в байтах, которые работают как в 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

Ответ 11

Для Win32 DOS вы можете:

c: > dir/s c:\directory\you\want

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

Я знаю, что это читает все файлы и каталоги, но в некоторых ситуациях работает быстрее.

Ответ 12

Когда создается папка, многие файловые системы 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}'