it-swarm-ru.tech

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

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

du -sh /*

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

52
xenoterracide
find -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done

Спасибо Жилю и ксенотеррациду за исправления безопасности/совместимости.

Первая часть: find -maxdepth 1 -type d вернет список всех каталогов в текущем рабочем каталоге. Это по трубопроводу ...

Вторая часть: while read -r dir; do начинает цикл while - пока канал, входящий в while, открыт (то есть до тех пор, пока не будет отправлен весь список каталогов), команда read поместит следующую строку в переменную "dir". Тогда это продолжается ...

Третья часть: printf "%s:\t" "$dir"; напечатает строку в "$ dir" (которая содержит одно из имен каталогов) с последующей вкладкой.

Четвертая часть: find "$dir -f file" создает список всех файлов внутри имени каталога, хранящихся в "$ dir". Этот список отправляется ..

Пятая часть: wc -l; подсчитывает количество строк, которые отправляются на его стандартный ввод.

Последняя часть: done просто завершает цикл while.

Таким образом, мы получаем список всех каталогов в текущем каталоге. Для каждого из этих каталогов мы генерируем список всех файлов в нем, чтобы мы могли сосчитать их все, используя wc -l. Результат будет выглядеть так:

./dir1: 234
./dir2: 11
./dir3: 2199
...
67
Shawn J. Goff

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

17
herohuyongtao

Вот компиляция некоторых полезных команд листинга (повторное хеширование на основе кода предыдущих пользователей):

список папок с количеством файлов:

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

список папок с ненулевым количеством файлов:

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 : %s\n" $n "$dir"; fi; done

список папок с количеством подпапок:

find -maxdepth 1 -type d | sort | while read -r dir; do n=$(find "$dir" -type d | wc -l); let n--; printf "%4d : %s\n" $n "$dir"; done

список папок с ненулевым количеством подпапок:

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

список пустых папок:

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 : %s\n" $n "$dir"; fi; done

список непустых папок с количеством контента:

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
13
DolphinDream

Пытаться:

find /path/to/start/at -type f -print | wc -l

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

find `find /path/to/start/at -mindepth 1 -maxdepth 1 -type d -print` -type f -print | wc -l
12
Cry Havok

Следующее решение подсчитывает фактическое количество используемых inode, начиная с текущего каталога:

find . -print0 | xargs -0 -n 1 ls -id | cut -d' ' -f1 | sort -u | wc -l

Чтобы получить количество файлов одного подмножества, используйте:

find . | wc -l

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

4
mouviciel

OS X 10.6 душит команду в принятом ответе, потому что она не указывает путь для find. Вместо этого используйте:

find . -maxdepth 1 -type d | while read -r dir; do printf "%s:\t" "$dir"; find "$dir" -type f | wc -l; done
2
abeboparebop

Я знаю, что опаздываю на вечеринку, но я верю, что это чистое bash (или другое решение Shell, которое принимает двойную звезду) может быть намного быстрее в некоторых ситуациях

shopt -s globstar    # to enable ** glob in bash
for dir in */; do a=( "$dir"/**/* ); printf "%s\t%s\n" "$dir:" "${#a[*]}"; done

вывод:

d1/:    302
d2/:    24
d3/:    640
...
2
jimmij

Попробуйте это:

find -type d -print0 | xargs -0 -I {} sh -c 'printf "%s\t%s\n" "$(find "{}" -maxdepth 1 -type f | wc -l)" "{}"'

Он должен работать нормально, если в именах файлов нет символов новой строки.

1
Paused until further notice.

du --inodes

Я не уверен, почему никто (включая меня) не знал о:

du --inodes
--inodes
      list inode usage information instead of block usage

Я уверен, что это решает проблему ОП. Я начал его использовать, чтобы выяснить, где находится весь мусор в моих огромных дисках (и перенести его на старый диск).

Дальнейшая информация

Если вы НЕ хотите повторяться (что может быть полезно в других ситуациях), добавьте

-S, --separate-dirs
1
Sridhar Sarnobat

Если у вас установлено ncdu (обязательно, когда вы хотите выполнить некоторую очистку), просто введите c, чтобы "Переключить отображение количества дочерних элементов". И C для "Сортировать по элементам".

1
Demi-Lune