findstr: дает больше совпадений, чем ожидалось - PullRequest
0 голосов
/ 15 апреля 2020

Я не понимаю, почему findstr не работает так, как я хочу.

У меня есть следующие файлы в моей тестовой директории:

aaa.jpg
bbb.png
ccc.svg

aaa_s.jpg
bbb_s.png
ccc_s.svg

aaa_small.jpg
bbb_small.png
ccc_small.svg

И у меня есть следующее строка для передачи непосредственно в cmd.exe:

for /f "delims=" %f in ('dir /b /a:-d ^| findstr /ile "gif jpg png svg" ^| findstr /ie "_s.*"') do echo "%f"

На мой взгляд, он должен соответствовать следующим файлам:

aaa_s.jpg
bbb_s.png
ccc_s.svg

Однако, на самом деле он соответствует

aaa_s.jpg
bbb_s.png
ccc_s.svg

aaa_small.jpg
bbb_small.png
ccc_small.svg

Что я делаю не так?

1 Ответ

1 голос
/ 15 апреля 2020

. - это подстановочный знак FindStr для любого символа, а * - для нуля или более вхождений предыдущего символа. Очевидно, что _s.* соответствует _s, за которым следует любой символ ноль или более раз; которая охватывает _sm.

. Откройте окно командной строки, введите findstr /?, нажмите клавишу ввода и прочитайте информацию об использовании.

Кстати, что не так с использованием:

Dir /B /A:-D *_s.*

При необходимости вы можете передать это на FindStr с помощью /I /L /E ".gif .jpg .png .svg", например:

Dir /B /A:-D *_s.* | FindStr /I /L /E ".gif .jpg .png .svg"

В качестве альтернативы вы можете включить несколько совпадений в команду Dir и забыть об использовании FindStr полностью:

Dir /B /A:-D "*_s.gif" "*_s.jpg" "*_s.png" "*_s.svg"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...