как получить суммарные размеры каталогов и их подкаталогов?

<p>допустим, я хочу получить размер каждого каталога файловой системы linux. когда я использую <code>ls -la</code>, я не получаю суммарный размер папок.</p><p>если я использую <code>df</code>, я получаю размер каждой смонтированной файловой системы, но это также не помогает мне. и с <code>du</code> я получаю размер каждого подкаталога и сводку всей файловой системы.</p><p>но я хочу иметь только суммарный размер каждого каталога в папке root файловой системы. есть ли команда для этого?</p>

<p>это делает то, что вы ищете:</p><pre><code>du -sh /* </code></pre><p>что это значит:</p><ul> <li><code>-s</code>, чтобы дать только сумму для каждого аргумента командной строки.</li> <li><code>-h</code> для удобочитаемых суффиксов, таких как <code>m</code> для мегабайт и <code>g</code> для гигабайт (необязательно).</li> <li> <p><code>/*</code> просто распространяется на все каталоги (и файлы) в <code>/</code>.</p> <p><em> примечание: точечные файлы не включены; запустите <code>shopt -s dotglob</code>, чтобы включить их тоже. </em></p> </li> </ul><p>также полезна сортировка по размеру:</p><pre><code>du -sh /* | sort -h </code></pre><p>вот:</p><ul> <li><code>-h</code> гарантирует, что <code>sort</code> правильно интерпретирует удобочитаемые суффиксы.</li> </ul>

<p>мне часто нужно найти самые большие каталоги, поэтому, чтобы получить отсортированный список, содержащий 20 самых больших каталогов, я делаю это:</p><pre><code>du -m /some/path | sort -nr | head -n 20 </code></pre><p>в этом случае размеры будут сообщаться в мегабайтах.</p>

<p>мне нравится использовать <a href="https://dev.yorhel.nl/ncdu"><strong> ncdu </strong></a> для этого, вы можете использовать курсор для навигации и просмотра структуры каталогов, это работает очень хорошо.</p>

<p>существующие ответы очень полезны, может быть, некоторые новички (такие как я) тоже найдут это полезным.</p><ol> <li> <p>очень простой цикл, но для меня это было хорошее начало для некоторых других операций, связанных с размером:</p> <pre><code>for each in $(ls) ; do du -hs "$each" ; done </code></pre></li> <li> <p>очень похоже на первый ответ и почти тот же результат, что и 1.), но мне потребовалось некоторое время, чтобы понять разницу от * до ./* в подкаталоге:</p> <pre><code>du -sh ./* </code></pre></li> </ol>

<p>следующий вызов <code>du</code> должен работать в системах bsd:</p><pre><code>du -d 1 / </code></pre>

<p>это не легко команда <code>du</code> показывает файлы и папки (по умолчанию) или только размеры всех элементов, которые вы указываете в командной строке (опция <code>-s</code>).</p><p>чтобы получить самые большие элементы (файлы и папки), отсортированные, с удобочитаемыми размерами в linux:</p><pre><code>du -h | sort -h </code></pre><p>это похоронит вас в кучу маленьких файлов. вы можете избавиться от них с помощью <code>--threshold</code> (1 мб в моем примере):</p><pre><code>du --threshold=1m -h | sort -h </code></pre><p>преимущество этой команды в том, что она содержит скрытые папки с точками (папки, начинающиеся с <code>.</code>).</p><p>если вы действительно просто хотите, чтобы папки, вам нужно использовать <code>find</code>, но это может быть очень, очень медленно, так как <code>du</code> придется сканировать много папок несколько раз:</p><pre><code>find . -type d -print0 | sort -z | xargs --null -i '{}' du -sh '{}' | sort -h </code></pre>

<p>имейте в виду, что вы не можете сравнивать каталоги с <code>du</code> на разных системах/машинах, не будучи уверенными, что оба разделяют один и тот же размер блока файловой системы. это может иметь значение, если вы пересылаете некоторые файлы с linux-машины на nas и хотите сравнить синхронизированный каталог самостоятельно. вы можете получить разные результаты с <code>du</code> из-за разных размеров блоков ....</p>

<p>вы можете использовать <code>ls</code> в сочетании с <code>awk</code>:</p><pre><code>ls -al * | awk 'begin {tot=0;} {tot = tot + $5;} end {printf ("%.2fmbn",tot/1024/1024);}' выходные данные ls передаются в awk. awk начинает обработку данных. стандартным разделителем является пробел. переменная суммы tot инициализируется нулем; следующий оператор выполняется для каждой строки/строки, выводимой ls. это просто увеличивает tot с размером. $5</code> обозначает пятый столбец (выводится <code>ls</code>). в конце мы делим на (1024 * 1024) сумму в мегабайтах.</p><p>если вы захотите преобразовать это в скрипт или функцию (.bashrc), вы также можете использовать его для получения размера определенных подмножеств каталогов в соответствии с типами файлов.</p><p>если вам нужна общесистемная информация, <code>kdirstat</code> может пригодиться!</p>

<p>вы также можете проверить <a href="http://xdiskusage.sourceforge.net/">xdiskusage</a> . предоставит вам ту же информацию, но показанную графически, плюс позволит развернуть (очень полезно). есть и другие подобные утилиты для kde и даже windows.</p>