it-swarm-ru.tech

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

Возможно дублирование:
Как подсчитать количество папок на диске с помощью Linux?

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

Например, учитывая это дерево каталогов:

/home/blue
/home/red
/home/dir/green
/home/dir/yellow
/home/otherDir/

Если я передам /home, я бы хотел, чтобы он возвратил четыре файла. Или бонусные баллы, если он возвращает четыре файла и два каталога. По сути, я хочу получить эквивалент щелчка правой кнопкой мыши по папке в Windows, выбора свойств и просмотра количества файлов/папок, содержащихся в этой папке.

Как мне легче всего это сделать? У меня есть решение, включающее скрипт Python, который я написал, но почему это не так просто, как запустить ls | wc или подобное?

180
omghai2u

find . -type f | wc -l

Объяснение:
find . -type f находит все файлы ( -type f ) в этом (. ) каталоге, а во всех подкаталогах имена файлов затем печатаются в стандартном формате по одному на строку.

Это тогда по трубопроводу | into wc (Word count) опция -l указывает wc только считать строки своего ввода.

Вместе они считают все ваши файлы.

317
Nifle

Ответы выше уже отвечают на вопрос, но я добавлю, что если вы используете find без аргументов (за исключением папки, в которой вы хотите, чтобы поиск происходил), как в:

find . | wc -l

поиск идет намного быстрее, почти мгновенно, или, по крайней мере, для меня. Это связано с тем, что предложение type должно запускать системный вызов stat () для каждого имени, чтобы проверить его тип - опуская его, вы избегаете этого.

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

46
Francisco Vieira

Для файлов:

find -type f | wc -l

Для каталогов:

find -mindepth 1 -type d | wc -l

Они оба работают в текущем рабочем каталоге.

25
cYrus

Небольшое обновление до принятого ответа, если вы хотите подсчет dirs и тому подобное

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn
8
Rich Homolka

С баш 4+

shopt -s globstar
for file in **/*
do
  if [ -d "$file" ];then
    ((d++))
  Elif [ -f "$file" ];then
     ((f++))
  fi
done
echo "number of files: $f"
echo "number of dirs: $d"

Не нужно дважды звонить, если вы хотите искать файлы и каталоги

8
user31894