Estou tentando localizar arquivos que correspondam a um padrão específico, mas a tentativa de executar o comando abaixo não retorna resultados, mesmo que existam arquivos que devam corresponder ao padrão.
find . -maxdepth 1 -regextype posix-extended -regex ".*/s_[a-zA-Z]_[a-zA-Z]\.png" -exec echo {} \;
Eu sei que isso .*/
corresponde a todo o caminho, mas não entendo muito bem o que isso significa exatamente.
Os arquivos que ele deve corresponder, por exemplo, incluem
- s_choose_blue.png
- s_choose_red.png
- s_new_blue.png
Responder1
O problema real com sua expressão regular é que ela não corresponde ao que deveria corresponder. Para decompô-lo:
.*/
– qualquer caractere, várias vezes, seguido de uma barra. Isso basicamente consome a lista de diretórios antes do nome real do arquivo, para que corresponda literalmente./
(como no seu exemplo), mas também./some/other/dir/
até a última barra.Isso funciona porque as expressões regulares são "gananciosos" por padrão, o que significa que elas correspondem tanto quanto podem. Em essência, esta parte permite apenas pesquisar o nome real do arquivo e retirar o caminho do resultado.
Para resumir, você precisa do
.*/
na frente do regex se tudo o que importa é o nome real do arquivo. Se você também precisar combinar algumas partes do caminho com o arquivo, não poderá usar.*/
s_
– isso funciona muito bem no seu exemplo[a-zA-Z]
– isso só consomeumpersonagem desta classe_
– seguido por um sublinhado[a-zA-Z]
– novamente seguido porumpersonagem\.png
– combine literalmente o ponto e a extensão
Então, você tem que mudar seu regex para:
.*/s_[a-zA-Z]+_[a-zA-Z]+\.png
Você terá que usar o +
, que basicamente diz um ou vários dos anteriores.