Я пытаюсь найти файлы, которые соответствуют определенному шаблону, однако попытка запустить приведенную ниже команду не дает результатов, даже если есть файлы, которые должны соответствовать шаблону.

find . -maxdepth 1 -regextype posix-extended -regex ".*/s_[a-zA-Z]_[a-zA-Z]\.png" -exec echo {} \;

Я знаю, что .*/ Соответствует всему пути, но не совсем понимаю, что это значит точно.

Файлы, которым он должен соответствовать, например, включают

  1. s_choose_blue.png
  2. s_choose_red.png
  3. s_new_blue.png

1 ответ1

1

Реальная проблема с вашим регулярным выражением в том, что оно не соответствует тому, что должно соответствовать. Чтобы сломать это:

  • .*/ - любой символ, несколько раз, за которым следует косая черта. Это в основном использует список каталогов перед фактическим именем файла, поэтому он будет буквально соответствовать ./ (как в вашем примере), но также ./some/other/dir/ до последнего слеша.

    Это работает, потому что регулярные выражения по умолчанию "жадные", что означает, что они совпадают настолько, насколько могут. По сути, эта часть позволяет вам просто искать фактическое имя файла и удалять путь из результата.

    Подводя итог, вам нужно .*/ Перед регулярным выражением, если все, что вам нужно, это фактическое имя файла. Если вам нужно сопоставить некоторые части пути к файлу, вы не можете использовать .*/

  • s_ - это прекрасно работает в вашем примере

  • [a-zA-Z] - это потребляет только одного персонажа из этого класса

  • _ - с последующим подчеркиванием

  • [a-zA-Z] - снова следует один символ

  • \.png - буквально соответствует точке и расширению

Итак, вы должны изменить свое регулярное выражение на:

.*/s_[a-zA-Z]+_[a-zA-Z]+\.png

Вам придется использовать + , который в основном говорит, один или несколько из предыдущих.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .