Подсчет файлов в папке и подпапках из командной строки

Как мне подсчитать все файлы заданного типа (например, *.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

дальнейшее чтение

Используйте комбинацию 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
Другие вопросы по тегам