Подсчет файлов в папке и подпапках из командной строки
Как мне подсчитать все файлы заданного типа (например, *.mp3) в указанной папке (и, необязательно, подпапках) из командной строки в переменную среды?
(пожалуйста, не PowerShell, просто командные команды)
5 ответов
set filesCount=0 & for %f in (*) do @(set /a filesCount+=1 > nul)
Подсчет файлов в папке и подпапках
Используйте следующую команду:
dir /b *.mp3 /s 2> nul | find "" /v /c > tmp && set /p count=<tmp && del tmp && echo %count%
Переменная среды %count%
будет содержать количество файлов.
Замечания:
- Удалить
/s
если вы не хотите считать файлы в подпапках.
Пример (используя *.txt)
Список каталогов для отображения 17 файлов:
F:\test>dir /b *.txt /s
F:\test\abc.txt
F:\test\blackwhite.txt
F:\test\cpu.txt
F:\test\interface.txt
F:\test\Lorem ipsum.txt
F:\test\right.txt
F:\test\rights.txt
F:\test\software.txt
F:\test\tabs.txt
F:\test\test.txt
F:\test\this is inside junction.txt
F:\test\unique.txt
F:\test\xyz.txt
F:\test\sub\abc.txt
F:\test\sub\xyz.txt
F:\test\sub with space\junction sub with space.txt
F:\test\sub with space\xyz.txt
Запустите команду:
F:\test>dir /b *.txt /s 2> nul | find "" /v /c > tmp && set /p count=<tmp && del tmp && echo %count%
17
дальнейшее чтение
- Индекс AZ командной строки Windows CMD - Отличный справочник по всем вопросам, связанным с командной строкой Windows.
- find - поиск текстовой строки в файле и отображение всех строк, где она найдена.
Используйте комбинацию dir
а также find
считать файлы. Сохраните файлы в переменной через for
петля. Перенаправить вывод ошибок на nul
прятаться File Not Found
ошибка.
@echo off
for /f %%i in ('dir *.xlsx /s /b 2^> nul ^| find "" /v /c') do set VAR=%%i
echo %VAR%
Смотрите описания параметров, используя /?
за dir
, find
, а также for
,
Немного опоздал на вечеринку, но я просто хотел выразить поддержку DavidPostill
DIR [LEAVE BLANK FOR ALL FILES, *.mp3, *.*] /B /A-D /S 2>NUL | FIND "" /V /C > tmp
SET /P COUNT=<tmp
SET /A COUNT -= 1
DEL tmp
ECHO !COUNT!
Это моя реализация; Я предпочитаю разделять вещи (поскольку команда создает файл, полезно уменьшить его на единицу).
ПРИМЕЧАНИЕ. Вышеуказанные файлы ВКЛЮЧАЮТ СКРЫТЫЕ или СИСТЕМНЫЕ файлы.
Чтобы исключить СКРЫТЫЕ и СИСТЕМНЫЕ файлы, замените на них [DIR...]
DIR [LEAVE BLANK FOR ALL FILES, *.mp3, *.*] /B /A-D-S-H /S 2>NUL | FIND "" /V /C > tmp
Также следует отметить, что метод [dir ...] как минимум на порядок эффективнее метода [for ... VAR+=1].
В моем случае было 510000 файлов; методом DIR ~6 СЕК; методом FOR, ~4 МИН.
Вы можете воспользоваться опцией robocopy (список). Тогда вам не понадобятся какие-то сложные петли или трубы. Это тоже очень быстро.
robocopy c:\mydir c:\dummy /L /E *.mp3 *.txt
-
c:\mydir
: замените это путем к каталогу, который вы хотите найти. -
c:\dummy
: вы можете оставить это, это просто фиктивный аргумент, который игнорируется, поскольку мы используем -
/L
: только список, ничего не копирует/перемещает. -
/E
: рекурсивно включать подкаталоги. Вы можете удалить это, если не хотите искать в подкаталогах. - Если вы не хотите распечатывать список файлов и каталогов, вы можете добавить
/NFL
(Нет списка файлов) и/или/NDL
(без списка режиссеров)
Вы получите хороший отчет, как показано ниже. Просто посмотрите наTotal
столбец.
Source : c:\mydir
Files : *.mp3
*.txt
--------------------------------------------------
{list of all the matching files}
--------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 5 5 0 0 0 0
Files : 89 89 0 0 0 0
Bytes : 3.485 g 3.485 g 0 0 0 0