Encuentra archivos filtrados por múltiples extensiones

52

¿Cuál es la sintaxis correcta para:

find . -type f -name \*.\(shtml\|css\)

Esto funciona, pero no es elegante:

find . -type f -name \*.shtml > f.txt && find . -type f -name \*.css >> f.txt

¿Cómo hacer lo mismo, pero con menos pulsaciones de teclas?

Dave Jarvis
fuente

Respuestas:

75

Puede combinar diferentes expresiones de búsqueda con los operadores lógicos -oro -and, para que su caso se pueda escribir como

find . -type f \( -name "*.shtml" -or -name "*.css" \)

Esto también muestra que no necesita escapar de caracteres especiales de shell cuando usa comillas.

Editar

Dado que -ortiene una precedencia más baja que la parte implícita -andentre -typeel primer -namenombre y el nombre entre paréntesis, como lo sugiere Chris.

Benjamin Bannier
fuente
Eso también imprimirá directorios llamados "* .css".
Teddy
Hmm, los paréntesis en tu versión actualizada están un poco fuera de lugar. Los paréntesis individuales deben terminar como parámetros separados para encontrar , por lo que necesitan espacios a su alrededor (`" .css ")` da como resultado un único valor de cadena; es lo mismo que (por ejemplo) ' ' ). Second, the parentheses need to go around whole ‘primaries’ (the open parenthesis needs to be before .css ) ' -name`, no entre él y su' operando ').
Chris Johnsen
15

Aquí hay una forma de hacer tu primera versión:

find -type f -regex ".*/.*\.\(shtml\|css\)"
Dennis Williamson
fuente
12

Necesita paréntesis para incluir solo archivos:

find . -type f \( -name "*.shtml" -o -name "*.css" \) -print

Bonificación : esta es una sintaxis compatible con POSIX.

Osito de peluche
fuente
4

A menudo me encuentro terminando usando egrep, o tuberías más largas, o perl para filtros aún más complejos:

find . -type f | egrep '\.(shtml|css)$'
find . -type f | perl -lne '/\.shtml|\.css|page\d+\.html$/ and print'

Puede ser algo menos eficiente, pero eso no suele ser una preocupación, y para cosas más complejas suele ser más fácil de construir y modificar.

La advertencia estándar se aplica sobre no usar esto para archivos con nombres de archivo extraños (por ejemplo, que contienen nuevas líneas).

reinierpost
fuente
+1 para una solución limpia y modular, los cuellos de botella de rendimiento generalmente ocurren mientras se procesan los archivos resultantes de los resultados de búsqueda.
Cristik el