176

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

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

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

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

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

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

5 ответов5

309

find . -type f | wc -l

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

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

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

45

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

find . | wc -l

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

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

25

Для файлов:

find -type f | wc -l

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

find -mindepth 1 -type d | wc -l

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

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"

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

7

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .