2009-08-06 1 views
83

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

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

+1

'ls' фактически показывает количество байтов в каждом файле, а не объем дискового пространства. Это достаточно для ваших нужд? –

ответ

42

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

du -sb DIR 

При желании можно добавить опцию h для более удобного выхода: формат

du -sbh DIR 
+3

-b, похоже, является незаконным вариантом для MacOS 'du – lynxoid

+2

@lynxoid: вы можете установить версию GNU с варевом: 'brew install coreutils'. Он будет доступен как команда 'gdu'. – neu242

9

Статкомитета «% S» дает фактическое количество байтов в файле ,

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

Не стесняйтесь заменять favourite method for summing numbers.

+3

Предпочтительно использовать «find. -type f -print0 | xargs -0 ...», чтобы избежать проблем с определенными именами файлов (содержащих пробелы и т. Д.). – hlovdal

+0

да, хороший момент. если он не был в bsd 4.2, я не помню его использовать :-( – Nelson

+1

'find -print0' и' xargs -0' необходимы для имен файлов с пробелами. OS X хочет 'stat -f% z'. – Kornel

93

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

% du -sbh <directory> 
+1

работает с моими новыми красными шляпными коробками, к сожалению, не на моем встроенном блоке Dev. –

+3

Есть ли простой способ показать «видимый размер» в человекочитаемом формате? du -shb' (как предложено в этом ответе), параметр '-b', похоже, отменяет настройку' -h'. –

+6

@MathiasBynens Отмените порядок флагов (т. е. du -sbh

). Работает для меня. –

4

Если вы используете BusyBox в «ий» в emebedded системы, вы не можете получить точные байты с обедненным ураном, только килобайт вы можете получить.

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) 
1

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

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

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

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

Единственное предостережение здесь, если у вас есть подкаталог, содержащий текст «total», он также выплюнет.

12

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

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

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

+2

Идеально, также добавьте параметр -a для получения «скрытых файлов» (что-либо, начиная с периода). – Nicholi

+0

Изолирован для определенного типа файла (в данном случае, PNG) и выражен в MB для большей читаемости: 'ls -lR | grep '.png $' | awk '{total + = $ 5} END {print "Total:", total/1024/1024, "MB"}' ' – MusikPolice

0

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

с:> реж/s C: \ каталог \ вы \ хотите

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

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

21

кд в каталог, а затем:

du -sh 

FTW!

Первоначально писал об этом здесь: https://ao.gl/get-the-total-size-of-all-the-files-in-a-directory/

+1

Это просто и работает! Благодарю. Иногда мне нравится добавлять опцию '-L', поэтому' du' следует символическим ссылкам. – conradkdotcom

+1

работает для меня (на OS X) –

1

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

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

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

+0

Обратите внимание, что это решение очень похоже на [ответ] (/ a/1267205/1300170) Баруна. Но это решение не суммирует файлы в подкаталогах. – ruvim

1

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 вариантов:

  1. -e0 просто ярлык для -e '0', который помещает 0 в стек,
  2. -f- для чтения и выполнения команд из стандартного ввода (который генерируется find здесь),
  3. -ep предназначен для печати результата (-e 'p').

Для печати размера в МиБ как 284.06 MiB мы можем использовать -e '2 k 1024/1024/n [ MiB] p' в пункте 3 вместо (большинство пространства не являются обязательными).

0

Когда создается папка, многие файловые системы Linux выделяют 4096 байт для хранения некоторых метаданных о самой директории. Это пространство увеличивается на 4096 байт по мере роста каталога.

ей команды (с или без опции -b) взять в счете этого пространства, как вы можете видеть, набрав:

mkdir test && du -b test 

вы будете иметь результат 4096 байт для пустой директории. Итак, если вы поместили 2 файла из 10000 байтов внутри каталога, общая сумма, заданная du -sb, составит 24096 байт.

Если вы внимательно прочитали вопрос, это не то, что было задано. Спрашивающий спросил:

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

, что в приведенном выше примере должен быть 20000 байт, а не 24096.

Итак, правильный ответ ИМХО может быть смесью Нельсоном ответа и hlovdal предложения обрабатывать имена файлов, содержащие пробела:

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

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