как узнать размер каталога linux или mac os x из командной строки?

<p>какую команду я использую, чтобы найти размер всех файлов (рекурсивно) в каталоге linux или mac os x?</p>

<p>версия bsd <code>du</code>, используемая в os x, сообщает о размере с 512-байтовыми блоками - размеры по существу округлены до следующего 512-байтового значения. это говорит о том, что место на диске больше, чем объем данных. если у вас много маленьких файлов, разница может быть большой.</p><p>вот пример.</p><p>это значение с обычной переменной <code>du</code>. это в 512-байтовых блоках:</p><pre><code>$ du -s 248 . флаг -h приводит к более читаемому числу в килобайтах. как и ожидалось, это половина числа 512-байтовых блоков:$ du -hs 124k . </code></pre><p>наконец, вы можете использовать <code>find</code> и <code>awk</code>, чтобы получить сумму фактических байтов в файлах. это немного медленно, но работает:</p><pre><code>$ find . -type f -exec ls -l {} ; | awk '{sum += $5} end {print sum}' 60527 </code></pre><p>это значение в точности совпадает с числом, сообщенным в окне «информация» в finder. (в этом наборе файлов нет никаких странных разветвлений или xattrs.) это значительно меньше значения, сообщаемого <code>du</code>.</p><p>вот как это работает: он получает список всех файлов и передает их <code>ls -l</code>; затем <code>awk</code> используется для подсчета байтов. флаг <code>-type f</code> установлен так, что только файлы (а не каталоги) отправляются в <code>ls</code>. без этого флага он также отправит имена каталогов в <code>ls</code>, и каждый файл будет указан дважды: один раз как отдельный файл и один раз как элемент в каталоге.</p><p>версия gnu <code>du</code> может давать значения в реальных байтах вместо блоков. к сожалению, bsd-версия <code>du</code> не так гибка.</p>

<p>показать размер одного файла</p><p><code>du -h path\_to\_a\_file</code></p><p>покажите размер содержимого каталога, каждого подкаталога и каждого отдельного файла:</p><p><code>du -h path\_to\_a\_directory</code></p><p>показать размер содержимого каталога:</p><p><code>du -sh path\_to\_a\_directory</code></p>

<p><strong> du </strong>- указывает<em> использование диска </em>не<em> размер файла </em>.</p><pre><code>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 

вы можете использовать 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. </code></pre><p>в противном случае используйте:</p><pre><code>du -a . | sort -rn | head -20 </code></pre>

<p>я объединил все ваши приложения и объединил их с удобочитаемым выводом:</p><pre><code>#!/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 } }}' </code></pre><p>ссылка на gist: <a href="https://gist.github.com/mlegenhausen/9365461">https://gist.github.com/mlegenhausen/9365461</a> </p>