Возможный дубликат:
Как я могу подсчитать количество папок на диске с помощью Linux?
У меня есть действительно глубокое дерево каталогов на моем ящике Linux. Я хотел бы считать все файлы в этом пути, включая все подкаталоги.
Например, учитывая это дерево каталогов:
/home/blue
/home/red
/home/dir/green
/home/dir/yellow
/home/otherDir/
Если я пройду /home
, Я хотел бы, чтобы он возвращал четыре файла. Или бонусные баллы, если он возвращает четыре файла и два каталога. В принципе, я хочу получить эквивалент щелчка правой кнопкой мыши по папке в Windows и выбора свойств и просмотра количества файлов / папок в этой папке.
Как я могу это сделать? У меня есть решение с использованием скрипта Python, который я написал, но почему это не так просто, как запуск ls | wc
или похожие?
find . -type f | wc -l
Объяснение:
find . -type f
находит все файлы ( Тип f ) в этом ( , ) и во всех подкаталогах имена файлов затем печатаются по стандарту один на строку.
Затем это передается по трубопроводу | в wc
(количество слов) -l
option указывает wc только на подсчет строк его ввода.
Вместе они подсчитывают все ваши файлы.
Ответы выше уже отвечают на вопрос, но я добавлю, что если вы используете find без аргументов (кроме папки, в которой вы хотите выполнить поиск), как в:
find . | wc -l
поиск идет намного быстрее, почти мгновенно или, по крайней мере, для меня.
Это связано с тем, что предложение типа должно запускать системный вызов stat () для каждого имени, чтобы проверить его тип - его исключение позволяет избежать этого.
Это имеет значение для возврата количества файлов и папок вместо файлов, но, по крайней мере, для меня это достаточно, поскольку я в основном использую это, чтобы найти, какие папки имеют огромные количества файлов, которые навсегда сохраняются, чтобы копировать и сжимать их. Подсчет папок по-прежнему позволяет мне находить папки с большинством файлов, мне нужна больше скорости, чем точность.
Для файлов:
find -type f | wc -l
Для каталогов:
find -mindepth 1 -type d | wc -l
Они оба работают в текущем рабочем каталоге.
С 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"
Нет необходимости вызывать поиск дважды, если вы хотите искать файлы и каталоги
Небольшое обновление принятого ответа, если вы хотите, чтобы количество каналов и таких
find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn