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

199

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

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

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

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

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

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

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

Ответы:

341

find . -type f | wc -l

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

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

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

Nifle
источник
1
Это не связано с ошибкой «из-за-одного» из-за последней новой строки в findвыводе
RobertDeRose
ТОЛЬКО для подсчета каталогов используйте '-type d' вместо '-type f': D
MevlütÖzdemir
1
Когда файлы не найдены, результат1
Dylanthepiguy
47

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

find . | wc -l

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

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

Франсиско Виейра
источник
1
Когда файлы не найдены, результат1
Dylanthepiguy
25

Для файлов:

find -type f | wc -l

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

find -mindepth 1 -type d | wc -l

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

Кир
источник
1
Когда файлы не найдены, результат1
Dylanthepiguy
8

С баш 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"

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

user31894
источник
8

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

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