Comando UNIX "buscar", hacer coincidir literalmente "punto"

1

Necesito archivos que terminen en ".pdf" o ".png"; Aquí está mi intento:

find /Users/robottinosino/Desktop/_PublishMe_ -type f -regex '.*[pdf|png]'

esto incluye incorrectamente archivos que terminan en "Apdf", "Zpdf", etc. (falta un punto literal antes de la extensión del archivo)

Traté de ajustar el patrón para:

find /Users/robottinosino/Desktop/_PublishMe_ -type f -regex '.*\.[pdf|png]'

pero luego no se devuelven resultados. Escapando de la. con una barra invertida no funciona. ¿Por qué?

[0] $ uname -a

Darwin Robottinosino.local 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386

¡Gracias!

Robottinosino
fuente
Uh Lo siento. :(
Robottinosino

Respuestas:

3

El problema no es el punto. Son los corchetes. Los corchetes definen una clase de caracteres; Estoy bastante seguro de que lo que intentas hacer es agrupar una alternancia. Para eso, necesita corchetes redondos. Necesita usar una expresión regular extendida para eso, y entonces el comando es:

find -E /Users/robottinosino/Desktop/_PublishMe_ -type f -regex '.*\.(pdf|png)'

Esa -Ebandera es un BSDism (OS X tiene una tierra de usuarios en gran medida BSD). En GNU find, usted dice -regextype posix-extended, en cambio , como una expresión en lugar de una bandera (según el comentario de Dennis Williamson , que sin duda es correcto).

Tom Anderson
fuente
Curiosamente, el segundo funciona como un encanto, pero el primero no. ¿El que no tiene "-E"? Que pasa
Robottinosino
Supongo que si no enciendo los RE modernos con -E, el comando falla debido a esto: las expresiones regulares obsoletas (`` básicas '') difieren en varios aspectos. `| ' es un personaje ordinario y no hay equivalente para su funcionalidad. (ref: man re_format en OSX)
Robottinosino
Ah, lamento haberte engañado en eso. Intenté una versión relacionada de ese comando localmente, pero sin el |, así que no entendí eso. Mi error. Eliminaré esa sugerencia.
Tom Anderson
5

En su lugar, podría usar algo como, a \( -name '*.pdf' -or -name '*.png' \)menos que tenga otra razón para combinar con una expresión regular.

milimoose
fuente
Necesito hacer coincidir archivos con cualquier extensión de una vez ..
Robottinosino
Para eso es eso -or.
millimoose
No sabía sobre -o, gracias por enseñarme eso.
Robottinosino
2

El patrón [pdf|png]coincide con cualquier uno de los caracteres dentro de los corchetes (incluyendo la tubería).

Prueba esto:

find /Users/robottinosino/Desktop/_PublishMe_ -type f -regex '.*\.\(pdf\|png\)'
Dennis Williamson
fuente
Hola dennis Gracias por responder. Esto no funciona ... pero si prefijo "-E" y luego reformulo a "-regex '. * \. (Pdf | png)' lo hace ... ¿por qué escapaste de la tubería? ¿Se debe a este comportamiento diferente? a la plataforma?
Robottinosino
@Robottinosino: El find(find (GNU findutils) 4.4.2) en mi sistema no tiene -E. Tiene -regextype posix-egrepy -regextype posix-extended(también posix-awk) que funcionan sin escapar de los paréntesis y la tubería.
Dennis Williamson
Todavía te voté en agradecimiento! ;) [Especifiqué que estaba en OSX en la pregunta original ...]
Robottinosino
@Robottinosino: Lo siento, no pude notar la etiqueta osx .
Dennis Williamson
Si no está familiarizado con OS X, la etiqueta es la única pista de que esa es la plataforma, pero si lo está, /Users/...absolutamente grita Mac.
Tom Anderson
0
find /Users/robottinosino/Desktop/_PublishMe_ -type f -regex '.*\.[pdf|png]'

fuente
0

Deberías estar usando -name *.pdfy no .*[pdf|png].
Tu expresión regular coincidirá .Apdf, .Zpngetc.

Puedes probar esto:
find . -type f | egrep '.pdf$|.png$'

cppcoder
fuente
El OP ya notó el primer error, el problema está en su segundo intento.
millimoose
0

Esto debería adaptarse a:

find /Users/robottinosino/Desktop/_PublishMe_ -type f -regextype posix-egrep -regex '.*\.(pdf|png)'

Si su versión de findno conoce -regextype posix-egrep, puede probar esto, en su lugar:

find /Users/robottinosino/Desktop/_PublishMe_ -type f '.*\.\(pdf\|png\)'
thb
fuente
find: -regextype: opción desconocida :(
Robottinosino