Найдите количество файлов с определенным расширением во всех подкаталогах
Есть ли способ найти количество файлов определенного типа без необходимости перебирать все результаты в Directory.GetFiles () или аналогичном методе? Я ищу что-то вроде этого:
Я знаю, что могу создать рекурсивную функцию для вызова Directory.GetFiles, но было бы намного чище, если бы я мог делать это без всех итераций.
EDIT: Если это невозможно сделать без рекурсии и итерации самостоятельно, как лучше всего это сделать?
7 ответы
Путь указывает путь, searchPattern указывает ваши подстановочные знаки (например, *, * .format), а SearchOption предоставляет возможность включать подкаталоги.
Свойство Length возвращаемого массива этого поиска предоставит правильное количество файлов для вашего конкретного шаблона поиска и параметра:
EDIT: В качестве альтернативы вы можете использовать Directory.EnumerateFiles метод
ответ дан 13 мая ’16, 15:05
Это серьезная проблема с производительностью при большом количестве файлов. — Цель Кай
@Aim — Не могли бы вы (или кто-нибудь еще) дать количественную оценку вашему утверждению? Насколько медленна «массовая проблема с производительностью»? Сколько значит «большое количество файлов»? Решение Jon работает для меня, но я хотел бы знать, когда / как это может стать проблемой. — Пыль
@DavidHAust Причина в том, что GetFiles метод материализует весь список файлов, находящихся в каталоге. Предпочтительный метод для вызова сейчас: Directory.EnumerateFiles поскольку он будет передавать файлы обратно (через yield -подобный механизм), поскольку основной вызов ОС возвращает результаты. — КасперУан
OP датируется 2008 годом . задолго до того, как Directory.EnumerateFiles был даже проблеском в глазах его папы. Не спешите переходить к старым постам, чтобы получить ответы, потому что доступны новые технологии. — Vic
Таким образом, EnumerateFiles значительно медленнее: если вам нужна масштабируемость, это нормально, но в большинстве случаев нет причин принимать удар. — Эамон Нербонн
Name already in use
Count-files / docs / documentation_ru / examples.md
- Go to file T
- Go to line L
- Copy path
- Copy permalink
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
Примеры практического использования
Более детально об общих аргументах path , —all , —case-sensitive , —no-recursion и —no-feedback в разделе Как использовать
Подсчет файлов по расширению: сортированная таблица
Короткая форма аргументов
Длинная форма аргументов
Наиболее простой формой использования является ввод команды без всяких аргументов.
По умолчанию программа будет рекурсивно считать файлы как в текущем рабочем каталоге, так и во всех его подкаталогах и отобразит таблицу, показывающую частоту для каждого расширения файла (например: .txt, .py, .html, .css) и их общее количество.
В этом случае расширения в таблице отображатся в верхнем регистре по умолчанию. Скрытые файлы и папки игнорируются.
Пример:

Таблица может быть отсортированна по алфавиту с помощью использования аргумента -alpha или —sort-alpha .
Пример с одним из общих аргументов:

Поиск файлов по расширению: список путей к файлам
Короткая форма аргументов
Длинная форма аргументов
Эта утилита также может использоваться для поиска файлов с определенным расширением (используя -fe или -file-extension ) и отображения короткого предварительного просмотра ( -p или —preview ) для текстовых файлов. Размер превью может быть дополнительно настроен с помощью аргумента -ps или —preview-size , за которым следует целое число(количество символов для представления).
Для получения справки о расширениях файлов, для которых доступно превью, используйте аргумент -st или —supported-types .
Результатом поиска по определенному расширению является список с полными путями найденных файлов. Если вам нужна информация о размере файлов, используйте аргумент -fs или —file-sizes .
Поиск и получение списка файлов с определенным расширением


Поиск и получение списка файлов без расширения
Для поиска файлов без расширения используйте символ . (точка)
Файлы с такими именами как .gitignore , Procfile , _netrc , считаются не имеющими расширения.
Пример: count-files —file-extension .
Поиск и получение списка всех файлов
Используйте две точки без пробелов .. для поиска всех файлов с расширением или без него.
Пример: count-files —file-extension ..
Общее количество файлов
Короткая форма аргументов
Длинная форма аргументов
Если вам нужно только общее количество всех файлов, количество файлов с определенным расширением или без него используйте аргумент -t или —total .
Чтобы подсчитать общее количество файлов, вы должны указать имя расширения.
Подсчет общего количества файлов с определенным расширением

Подсчет общего количества файлов без расширения
Используйте символ . (точка) для подсчета общего количества файлов без расширения.
Пример: count-files —total .
Подсчет общего количества файлов независимо от расширения
Используйте две точки без пробелов .. для подсчета всех файлов в папке.
Пример: count-files —total ..
Узнать количество файлов по расширениям и другие параметры
Ищу приложение для следующей задачи: нужно узнать количество файлов в определённом каталоге по расширениям. Например: mp4 — столько, flac — столько. На крайний случай можно и в консоли, но хотелось бы посмотреть список файлов с путями, возможно удалить и т.п. Также хотелось бы увидеть список файлов с наибольшим размером. Тоесть нужно приложение для просмотра статистики файлов.
lord_i — 7 Ноябрь, 2014 — 22:15

Если это делать по очереди для каждого расширения то вполне подойдет «выделить группу» по маске в крузадере или каком-то другом файловом менеджере. Если Вам нужна статистика одновременно для всех расширений — думаю надо скрипт писать.
kot040188 — 7 Ноябрь, 2014 — 22:36
Если это делать по очереди для каждого расширения
Эдак я в любом файловом менеджере могу сделать. Я хочу комплексно подойти к вопросу =)
human — 8 Ноябрь, 2014 — 15:05
Нашел вот это, но, к сожалению, не работает (скрипт bash). Думается, местные гуру подскажут где вкралась ошибка.
5. Как узнать сколько файлов с каким расширением находятся в папке:
find /target/folder -type f | sed -r ‘s/^.*\.([^.]+)$/\1/’ | tr “[:upper:]” “[:lower:]” | awk ‘ < ext[$1]++ >END < for (e in ext) print ext[e], e >’ | sort -nr|head -n 20
find /target/folder -type f – выбираем все файлы из заданной папки
sed -r ‘s/^.*\.([^.]+)$/\1/’ | tr “[:upper:]” “[:lower:]“ – из списка их имен формируем список всех расширений
awk ‘ < ext[$1]++ >END < for (e in ext) print ext[e], e >’ – производим подсчет всех расширений
sort -nr|head -n 20 – выводим первые двадцать позиций из отсортированного списка расширений, в порядке убывания найденных с таким определением файлов
Оригинал здесь
Также хотелось бы увидеть список файлов с наибольшим размером. Тоесть нужно приложение для просмотра статистики файлов
В Крусайдере жмем Alt+Стрелка вниз, выбираем панель статистики, там можно посмотреть крупные файлы и кучу всего прочего.
kot040188 — 8 Ноябрь, 2014 — 15:16
В Крусайдере жмем Alt+Стрелка вниз, выбираем панель статистики, там можно посмотреть крупные файлы и кучу всего прочего.
То что нужно по части размеров. Вот если бы ещё отдельно от крусайдера… Такую бы штуку по части расширений…
Найдите количество файлов с определенным расширением во всех подкаталогах
Есть ли способ найти количество файлов определенного типа без необходимости перебирать все результаты в Directory.GetFiles () или аналогичном методе? Я ищу что-то вроде этого:
Я знаю, что могу создать рекурсивную функцию для вызова Directory.GetFiles, но было бы намного чище, если бы я мог делать это без всех итераций.
РЕДАКТИРОВАТЬ: Если это невозможно сделать без рекурсии и итерации самостоятельно, как лучше всего это сделать?
7 ответов
Вам следует использовать перегрузку Directory.GetFiles (path, searchPattern, SearchOption) из Directory.GetFiles ().
Путь указывает путь, searchPattern указывает ваши подстановочные знаки (например, *, * .format), а SearchOption предоставляет возможность включать подкаталоги.
Свойство Length возвращаемого массива этого поиска предоставит правильное количество файлов для вашего конкретного шаблона поиска и параметра:
РЕДАКТИРОВАТЬ: В качестве альтернативы вы можете использовать метод Directory.EnumerateFiles
Самый удобный способ — использовать linq:
Вы можете использовать эту перегрузку GetFiles:
И этот член SearchOption:
AllDirectories — включает текущий каталог и все подкаталоги в поисковой операции. Этот вариант включает точки повторной обработки, такие как смонтированные диски и символические ссылки в поиск.
GetFiles возвращает массив строк, поэтому вы можете просто получить длину, которая представляет собой количество найденных файлов.
Искал более оптимизированную версию. Поскольку я не нашел его, я решил его закодировать и поделиться здесь:
Все решения, использующие GetFiles / GetDirectories, отчасти медленные, поскольку все эти объекты необходимо создавать. Используя перечисление, он не создает никаких временных объектов (FileInfo / DirectoryInfo).