Вопрос или проблема
Я хочу найти общее количество файлов в папке и всех её подпапках.
Возможно, что-то вроде этого сработает:
find . -type f | wc -l
Попробуйте команду из родительской папки.
find . -name <pattern> -type f
находит всеф
айлы в текущей папке (.
) и ее подпапках.-name <pattern>
ищет только определенные файлы, которые соответствуют заданному шаблону. Соответствие учитывает регистр. Если нужно, чтобы соответствие было нечувствительно к регистру, используйте-iname
.- Результат (список найденных файлов) передается (
|
) вwc -l
, который считает количествостр
ок.
Используйте команду tree
. Вам, возможно, потребуется установить пакет tree
.
Он перечислит все файлы и папки в указанной папке и выведет сводку в конце.
Чтобы подсчитать файлы (даже без расширения) в корне текущей директории, используйте:
ls -l | grep ^- | wc -l
Чтобы подсчитать файлы (даже без расширения) рекурсивно из корня текущей директории, используйте:
ls -lR | grep ^- | wc -l
Самый быстрый и простой способ — использовать tree
. Его скорость ограничена вашим терминалом вывода, так что если вы перенаправите результат в tail -1
, вы получите мгновенный результат. Вы также можете контролировать уровень папок, для которых хотите результаты, используя опцию -L
. Для цветного вывода используйте -C
. Например:
$ tree share/some/directory/ | tail -1
558 directories, 853 files
$ tree -L 2 share/some/directory/ | tail -1
120 directories, 3 files
Если его еще нет, можете получить его здесь.
find -type f -printf . | wc -c
Не учитывайте строки вывода find, потому что имена файлов, содержащие 99 переводов строки, будут считаться за 100 файлов.
Используйте эту команду для каждой папки на пути
for D in *; do echo $D; find $D -type f| wc -l; done
Вы можете использовать find . | wc -l
find .
перечислит все файлы и папки и их содержимое, начиная с вашей текущей папки.
wc -l
считает результаты find
find кажется быстрее, чем tree, поэтому я использовал нижеследующее, чтобы подсчитать файлы в каждой директории текущего рабочего каталога (игнорируя файлы в CWD), позволяя директориям содержать пробелы:
ls -d */ | while read dir_line
do
echo -n "$dir_line :"
find "$dir_line" -type f | wc -l
done
Я бы выбрал этот вариант:
ls -alR | grep -c ^-
Тест на find
против ls
против tree
hyperfine \
> "find . -type f | wc -l" \
> "ls -lR | grep ^- | wc -l" \
> "tree . | tail -1"
Benchmark 1: find . -type f | wc -l
Time (mean ± σ): 3.070 s ± 0.030 s [User: 0.284 s, System: 2.827 s]
Range (min … max): 3.038 s … 3.126 s 10 runs
Benchmark 2: ls -lR | grep ^- | wc -l
Time (mean ± σ): 5.887 s ± 0.054 s [User: 0.896 s, System: 5.160 s]
Range (min … max): 5.845 s … 6.020 s 10 runs
Benchmark 3: tree . | tail -1
Time (mean ± σ): 4.475 s ± 0.089 s [User: 1.254 s, System: 3.280 s]
Range (min … max): 4.349 s … 4.677 s 10 runs
Summary
'find . -type f | wc -l' ran
1.46 ± 0.03 times faster than 'tree . | tail -1'
1.92 ± 0.03 times faster than 'ls -lR | grep ^- | wc -l'
find
кажется более эффективным на моей директории
.
Ответ или решение
Для эффективного подсчета количества файлов в папке и во всех ее подпапках в операционных системах на базе Unix, таких как Linux, используется команда find
. Это мощный инструмент для поиска файлов и может быть конфигурирован в качестве эффективного счетчика файлов. Рассмотрим теорию, примеры использования и применение этой команды с учетом различных сценариев.
Теория
Основной принцип работы команды find
заключается в рекурсивном поиске файлов, который начинается из указанной папки и охватывает все вложенные директории. Опция -type f
позволяет ограничить поиск только файлами, исключая при этом папки. Когда мы соединяем вывод команды find
с wc -l
(wc – сокращение от word count), мы получаем количество строк в выводе. Поскольку каждая строка соответствует отдельному файлу, wc -l
дает в итоге общее число файлов.
Примеры использования
-
Базовый подсчет файлов:
find . -type f | wc -l
Эта команда ищет все файлы в текущей директории и поддиректориях, потом считает количество строк в этом списке, предоставляя общее количество файлов.
-
Фильтрация по шаблону:
find . -name "*.txt" -type f | wc -l
Здесь используется параметр
-name "*.txt"
, чтобы искать только файлы с расширением .txt. Использование опции-iname
вместо-name
позволяет осуществлять поиск в безучетным регистра. -
Исключение определенных директорий:
find . -type f ! -path "./exclude_dir/*" | wc -l
Команда исключает файлы в директории exclude_dir из подсчета благодаря использованию
! -path
. -
Использование
-printf
для более точного подсчета:find . -type f -printf '.' | wc -c
Здесь командная последовательность
-printf '.'
выводит точку для каждого найденного файла, аwc -c
подсчитывает количество символов, что дает точное количество файлов, в том числе для файлов с переносами строк в именах.
Применение
Применение на практике
-
Анализ файловой структуры: частое использование команд типа
find
помогает системным администраторам и разработчикам быстро оценить количество файлов, особенно полезно при подготовке миграций данных или оценке плотности файлов для оптимизации хранения. -
Автоматизация задач: команды, подобные приведенным, могут интегрироваться в скрипты резервного копирования и архивации, где важно учитывать общее количество файлов, чтобы правильно распределить нагрузку на каналы передачи данных и дисковые ресурсы.
-
Мониторинг и отладка приложений: когда приложения создают большое количество временных файлов,
find
позволяет своевременно обнаружить и оценить их объем, что особенно критично в контексте поддержания производительности систем.
Применение в альтернативных сценариях
Оверклокинг подобных команд может быть полезным и в нестандартных сценариях, таких как исследование новых программ, диагностика файловой системы или выполнение комплексных задач по администрированию и управлению файловыми системами. Обладая широкими настройками и возможностью интеграции с другими утилитами, find
остается незаменимым инструментом для пользователей, стремящихся к эффективному управлению файлами на системах Linux/Unix.
Понимание всех деталей и возможностей команды find
и ее интеграция с другими инструментами командной строки существенно расширяет возможности управления и контроля за файловой системой, делает процессы более прозрачными и управляемыми, помогая поддерживать высокий уровень контроля над IT-инфраструктурой.