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

  

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

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

Например, если задано это дерево каталогов:

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

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

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

164 голоса | спросил omghai2u 13 +04002010-10-13T01:41:12+04:00312010bEurope/MoscowWed, 13 Oct 2010 01:41:12 +0400 2010, 01:41:12

5 ответов


289

find . -type f | wc -l

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

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

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

ответил Nifle 13 +04002010-10-13T01:44:53+04:00312010bEurope/MoscowWed, 13 Oct 2010 01:44:53 +0400 2010, 01:44:53
42

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

find . | wc -l

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

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

ответил Francisco Vieira 29 MaramTue, 29 Mar 2011 02:00:38 +04002011-03-29T02:00:38+04:0002 2011, 02:00:38
24

Для файлов:

find -type f | wc -l

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

find -mindepth 1 -type d | wc -l

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

ответил cYrus 13 +04002010-10-13T01:56:03+04:00312010bEurope/MoscowWed, 13 Oct 2010 01:56:03 +0400 2010, 01:56:03
8

С 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"

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

ответил user31894 13 +04002010-10-13T05:58:12+04:00312010bEurope/MoscowWed, 13 Oct 2010 05:58:12 +0400 2010, 05:58:12
7

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

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn
ответил Rich Homolka 13 +04002010-10-13T18:26:17+04:00312010bEurope/MoscowWed, 13 Oct 2010 18:26:17 +0400 2010, 18:26:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132