
Estou tentando pesquisar uma pasta que contém variações de diferentes nomes de arquivos de imagens:
1_2-300x224.jpg
1_2-600x449.jpg
1_2-600x600.jpg
1_2-768x575.jpg
1_2-802x600.jpg
1_2.jpg
O plano é localizar e excluir os arquivos que terminam em 2 a 4 dígitos + 'x' + 2 a 4 dígitos. Posso criar esta partida emRegexrusando a expressão .*(\d{2,4}x\d{2,4}).jpg
(esta expressão destaca tudo, exceto 1_2.jpg
).
No entanto, a execução find . -name ".*(\d{2,4}x\d{2,4}).jpg"
não retorna resultados.
Estou confuso!
Responder1
Existem alguns problemas aqui. Em primeiro lugar, como John mencionou, -name
faz correspondência de substring com globs, você precisa usar -regex
e, em segundo lugar, existem incompatibilidades de dialeto de expressão regular. Por padrão, GNU find usa expressões regulares Emacs e BSD find usa expressões regulares posix-basic. Se você find.info
instalou, pode ler mais sobre isso aqui:
info find.info 'Reference' 'Regular Expressions' 'emacs regular expression'
Os dialetos de expressões regulares suportados podem ser encontrados aqui:
info find.info 'Reference' 'Regular Expressions'
Aqui:
* findutils-default regular expression syntax::
* emacs regular expression syntax::
* gnu-awk regular expression syntax::
* grep regular expression syntax::
* posix-awk regular expression syntax::
* awk regular expression syntax::
* posix-basic regular expression syntax::
* posix-egrep regular expression syntax::
* egrep regular expression syntax::
* posix-extended regular expression syntax::
GNU encontrar
Você pode fazer sua expressão funcionar posix-extended
assim com GNU find:
find . -regextype posix-extended -regex '.*[0-9]{2,4}x[0-9]{2,4}.jpg'
Saída:
./1_2-600x600.jpg
./1_2-802x600.jpg
./1_2-600x449.jpg
./1_2-300x224.jpg
./1_2-768x575.jpg
Encontrar BSD
Não tenho acesso ao BSD find, mas acho que isso deve funcionar:
find -E . -regex '.*[0-9]{2,4}x[0-9]{2,4}\.jpg'