2010-10-12 21:41:12 +0000 2010-10-12 21:41:12 +0000
217
217

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

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

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

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

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

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

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

Ответы (5)

364
364
364
2010-10-12 21:44:53 +0000

find . -type f | wc -l

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

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

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

49
49
49
2011-03-28 22:00:38 +0000

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

find . | wc -l

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

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

26
26
26
2010-10-12 21:56:03 +0000

Для файлов:

find -type f | wc -l

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

find -mindepth 1 -type d | wc -l

Они оба работают в текущей рабочей директории.

8
8
8
2010-10-13 01:58:12 +0000

С 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
8
8
2010-10-13 14:26:17 +0000

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

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

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

6
10
7
5
5