Я пытаюсь найти файлы, соответствующие определенному шаблону, однако попытка выполнить команду ниже не возвращает никаких результатов, хотя есть файлы, которые должны соответствовать шаблону.
find . -maxdepth 1 -regextype posix-extended -regex ".*/s_[a-zA-Z]_[a-zA-Z]\.png" -exec echo {} \;
Я знаю, что это .*/
соответствует всему пути, но не совсем понимаю, что именно это значит.
Файлы, которым он должен соответствовать, включают, например,
- s_choose_blue.png
- s_choose_red.png
- s_new_blue.png
решение1
На самом деле проблема с вашим регулярным выражением в том, что оно не соответствует тому, чему должно соответствовать. Разберем его:
.*/
– любой символ, несколько раз, за которым следует слеш. Это в основном потребляет список каталогов до фактического имени файла, так что это будет буквально соответствовать./
(как в вашем примере), но также и./some/other/dir/
, вплоть до последнего слеша.Это работает, потому что регулярные выражения по умолчанию «жадные», то есть они сопоставляют столько, сколько могут. По сути, эта часть позволяет вам просто искать фактическое имя файла и вырезать путь из результата.
Подводя итог, вам нужно
.*/
перед регулярным выражением, если все, что вас волнует, это фактическое имя файла. Если вам нужно сопоставить некоторые части пути к файлу, вы не можете использовать.*/
s_
– в вашем примере это работает просто отлично[a-zA-Z]
– это только потребляетодинперсонаж из этого класса_
– с последующим подчеркиванием[a-zA-Z]
– снова следуетодинхарактер\.png
– буквально сопоставьте точку и расширение
Итак, вам нужно изменить свое регулярное выражение на:
.*/s_[a-zA-Z]+_[a-zA-Z]+\.png
Вам придется использовать +
, что по сути означает одно или несколько из предыдущего.