
Estoy intentando buscar una carpeta que contenga variaciones de diferentes nombres de archivos de imágenes:
1_2-300x224.jpg
1_2-600x449.jpg
1_2-600x600.jpg
1_2-768x575.jpg
1_2-802x600.jpg
1_2.jpg
El plan es buscar y eliminar los archivos que terminan en 2-4 dígitos + 'x' + 2-4 dígitos. Puedo crear esta coincidencia enexpresión regularusando la expresión .*(\d{2,4}x\d{2,4}).jpg
(esta expresión resalta todo excepto 1_2.jpg
).
Sin embargo, la ejecución find . -name ".*(\d{2,4}x\d{2,4}).jpg"
no arroja resultados.
¡Estoy desconcertado!
Respuesta1
Hay un par de problemas aquí. En primer lugar, como mencionó John, -name
es necesario usar la coincidencia de subcadenas con globos -regex
y, en segundo lugar, existen incompatibilidades de dialectos de expresiones regulares. Por defecto, GNU find usa expresiones regulares de Emacs y BSD find usa expresiones regulares posix-basic. Si lo has find.info
instalado puedes leer más sobre ello aquí:
info find.info 'Reference' 'Regular Expressions' 'emacs regular expression'
Los dialectos de expresiones regulares admitidos se pueden encontrar aquí:
info find.info 'Reference' 'Regular Expressions'
Aquí:
* 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::
encontrar GNU
Puedes hacer que tu expresión funcione posix-extended
así con GNU find:
find . -regextype posix-extended -regex '.*[0-9]{2,4}x[0-9]{2,4}.jpg'
Producción:
./1_2-600x600.jpg
./1_2-802x600.jpg
./1_2-600x449.jpg
./1_2-300x224.jpg
./1_2-768x575.jpg
encontrar BSD
No tengo acceso a BSD Find, pero creo que esto debería funcionar:
find -E . -regex '.*[0-9]{2,4}x[0-9]{2,4}\.jpg'