Найти количество файлов в папке и подпапках?

Вопрос или проблема

Я хочу найти общее количество файлов в папке и всех её подпапках.

Возможно, что-то вроде этого сработает:

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 дает в итоге общее число файлов.

Примеры использования

  1. Базовый подсчет файлов:

    find . -type f | wc -l

    Эта команда ищет все файлы в текущей директории и поддиректориях, потом считает количество строк в этом списке, предоставляя общее количество файлов.

  2. Фильтрация по шаблону:

    find . -name "*.txt" -type f | wc -l

    Здесь используется параметр -name "*.txt", чтобы искать только файлы с расширением .txt. Использование опции -iname вместо -name позволяет осуществлять поиск в безучетным регистра.

  3. Исключение определенных директорий:

    find . -type f ! -path "./exclude_dir/*" | wc -l

    Команда исключает файлы в директории exclude_dir из подсчета благодаря использованию ! -path.

  4. Использование -printf для более точного подсчета:

    find . -type f -printf '.' | wc -c

    Здесь командная последовательность -printf '.' выводит точку для каждого найденного файла, а wc -c подсчитывает количество символов, что дает точное количество файлов, в том числе для файлов с переносами строк в именах.

Применение

Применение на практике

  • Анализ файловой структуры: частое использование команд типа find помогает системным администраторам и разработчикам быстро оценить количество файлов, особенно полезно при подготовке миграций данных или оценке плотности файлов для оптимизации хранения.

  • Автоматизация задач: команды, подобные приведенным, могут интегрироваться в скрипты резервного копирования и архивации, где важно учитывать общее количество файлов, чтобы правильно распределить нагрузку на каналы передачи данных и дисковые ресурсы.

  • Мониторинг и отладка приложений: когда приложения создают большое количество временных файлов, find позволяет своевременно обнаружить и оценить их объем, что особенно критично в контексте поддержания производительности систем.

Применение в альтернативных сценариях

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

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

Оцените материал
Добавить комментарий

Капча загружается...