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

<p>я хочу посмотреть, сколько файлов находится в подкаталогах, чтобы выяснить, где в системе используется весь индекс. вроде как я бы сделал это для использования пространства</p><pre><code>du -sh /* </code></pre><p>что даст мне пространство, используемое в каталогах вне root, но в этом случае я хочу количество файлов, а не размер.</p>

<pre><code>find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done </code></pre><p>спасибо жилю и ксенотеррациду за исправления безопасности/совместимости.</p><p>первая часть: <code>find -maxdepth 1 -type d</code> вернет список всех каталогов в текущем рабочем каталоге. это по трубопроводу ...</p><p>вторая часть: <code>while read -r dir; do</code> начинает цикл while - пока канал, входящий в while, открыт (то есть до тех пор, пока не будет отправлен весь список каталогов), команда read поместит следующую строку в переменную "dir". тогда это продолжается ...</p><p>третья часть: <code>printf "%s:\t" "$dir"; напечатает строку в "$ dir" (которая содержит одно из имен каталогов) с последующей вкладкой.</p><p>четвертая часть: <code>find "$dir -f file" создает список всех файлов внутри имени каталога, хранящихся в "$ dir". этот список отправляется ..</p><p>пятая часть: <code>wc -l;</code> подсчитывает количество строк, которые отправляются на его стандартный ввод.</p><p>последняя часть: <code>done</code> просто завершает цикл while.</p><p>таким образом, мы получаем список всех каталогов в текущем каталоге. для каждого из этих каталогов мы генерируем список всех файлов в нем, чтобы мы могли сосчитать их все, используя <code>wc -l</code>. результат будет выглядеть так:</p><pre><code>./dir1: 234 ./dir2: 11 ./dir3: 2199 ... </code></pre>

<p>пытаться <code>find . -type f | wc -l</code>, он будет считать все файлы в текущем каталоге, а также все файлы в подкаталогах. обратите внимание, что все каталоги не будут учитываться как файлы, только обычные файлы.</p>

<p>вот компиляция некоторых полезных команд листинга (повторное хеширование на основе кода предыдущих пользователей):</p><p><strong>список папок с количеством файлов:</strong></p><pre><code>find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); printf "%4d : %s\n" $n "$dir"; done </code></pre><p><strong>список папок с ненулевым количеством файлов:</strong></p><pre><code>find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type f | wc -l); if [ $n -gt 0 ]; then printf "%4d : %sn" $n "$dir"; fi; done <strong>список папок с количеством подпапок:</strong>find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; printf "%4d : %sn" $n "$dir"; done <strong>список папок с ненулевым количеством подпапок:</strong>find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done </code></pre><p><strong>список пустых папок:</strong></p><pre><code>find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -eq 0 ]; then printf "%4d : %sn" $n "$dir"; fi; done <strong>список непустых папок с количеством контента:</strong>find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" | wc -l); let n--; if [ $n -gt 0 ]; then printf "%4d : %s\n" $n "$dir"; fi; done </code></pre>

<p>пытаться:</p><pre><code>find /path/to/start/at -type f -print | wc -l </code></pre><p>в качестве отправной точки, или если вы действительно хотите проходить только через подкаталоги каталога (и пропускать файлы в этом каталоге верхнего уровня)</p><pre><code>find `find /path/to/start/at -mindepth 1 -maxdepth 1 -type d -print` -type f -print | wc -l </code></pre>

<p>следующее решение подсчитывает фактическое количество используемых inode, начиная с текущего каталога:</p><pre><code>find . -print0 | xargs -0 -n 1 ls -id | cut -d' ' -f1 | sort -u | wc -l </code></pre><p>чтобы получить количество файлов одного подмножества, используйте:</p><pre><code>find . | wc -l </code></pre><p>для решений, исследующих только подкаталоги, без учета файлов в текущем каталоге, вы можете обратиться к другим ответам.</p>

<p>os x 10.6 душит команду в принятом ответе, потому что она не указывает путь для <code>find</code>. вместо этого используйте:</p><pre><code>find . -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done </code></pre>

<p>я знаю, что опаздываю на вечеринку, но я верю, что это чистое <code>bash</code> (или другое решение shell, которое принимает двойную звезду) может быть намного быстрее в некоторых ситуациях</p><pre><code>shopt -s globstar # to enable ** glob in bash for dir in */; do a=( "$dir"// ); printf "%st%sn" "$dir:" "${#a[]}"; done вывод:d1/: 302 d2/: 24 d3/: 640 ... 

попробуйте это:find -type d -print0 | xargs -0 -i {} sh -c 'printf "%st%sn" "$(find "{}" -maxdepth 1 -type f | wc -l)" "{}"' </code></pre><p>он должен работать нормально, если в именах файлов нет символов новой строки.</p>

<h1>du --inodes</h1><p>я не уверен, почему никто (включая меня) не знал о:</p><pre><code>du --inodes </code></pre><pre><code>--inodes list inode usage information instead of block usage </code></pre><p>я уверен, что это решает проблему оп. я начал его использовать, чтобы выяснить, где находится весь мусор в моих огромных дисках (и перенести его на старый диск).</p><h3>дальнейшая информация</h3><p>если вы не хотите повторяться (что может быть полезно в других ситуациях), добавьте</p><pre><code>-s, --separate-dirs </code></pre>

<p>если у вас установлено <code>ncdu</code> (обязательно, когда вы хотите выполнить некоторую очистку), просто введите <code>c</code>, чтобы "переключить отображение количества дочерних элементов". и <code>c</code> для "сортировать по элементам".</p>