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


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

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

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

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

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

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


165
2017-10-12 21:41


происхождения


Не совсем то, что вы ищете, но чтобы получить очень быстрое общее количество, если ваш locate база данных обновлена: locate /some/path | wc -l (или на моем Mac: locate -c /some/path). Но: это также будет считать файлы в /this/other/path/with/some/path, и будет считать сами папки. - Arjan
Кстати, это другая, но тесно связанная с этим проблема (подсчет всех каталогов на диске) и решение: superuser.com/questions/129088/... - Amanda


ответы:


find . -type f | wc -l

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

Затем это передается по трубопроводу | в wc (количество слов) -l option указывает wc только на подсчет строк его ввода.

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


289
2017-10-12 21:44





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

find . | wc -l

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

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


42
2018-03-28 22:00





Для файлов:

find -type f | wc -l

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

find -mindepth 1 -type d | wc -l

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


24
2017-10-12 21:56





С bash 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
2017-10-13 01:58





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

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

7
2017-10-13 14:26



На Mac / BSD: find $DIR -exec stat -f '%HT' {} \; | sort | uniq -c | sort -rn (Здесь, введите %T пуст для обычного файла, звездочки для исполняемого файла или косой черты для папки; следовательно %HT или некоторый дополнительный текст, чтобы избежать того, чтобы пространство не подсчитывалось, например > %T.) - Arjan