Usando `find` para múltiples extensiones de archivo

16

Estoy usando el siguiente comando para contar las líneas de texto en archivos JAVA:

find . -name '*.java' | xargs wc -l

¿Cómo puedo modificar los findparámetros del comando para que coincidan con más de una extensión de archivo? Por ejemplo, me gustaría usar la operación anterior para archivos CPP, C y H.

Javier
fuente
Esta pregunta es en realidad sobre el findcomando, ya que es donde está buscando archivos coincidentes.
iglvzx
1
Asimismo, debe utilizar el find -print0 | xargs -0constructo o aún mejor y más simple: find . -name '*.cpp' -o -name '*.c' -o -name '*.h' -exec wc -l {} +. Esto evitará cualquier problema de nombre de archivo (espacios en blanco, nuevas líneas, etc.) y es (muy) buena costumbre.
Daniel Andersson

Respuestas:

16

Use la -oopción para un OR. Por ejemplo, esto podría enumerar .cpp, .cy .harchivos:

find . -name \*.cpp -o -name \*.c -o -name \*.h
JOTN
fuente
Ah Las *necesidades ya no se escaparon si formato de código. Totalmente pasado por alto eso. :)
iglvzx
Sí, tomó dos ediciones por dos personas, pero lo obtuvimos.
JOTN
2
Esto no funcionó para mí en OSX (solo coincidía con el apellido * .ext). Tuve que usar paréntesis como lo sugiere @smokinguns a continuación.
Galaad
2

Deberá usar la opción -o. Por ejemplo, la siguiente declaración encuentra todos los archivos png, jpg y gif en una carpeta.

find . \( -iname \*.png -o -iname \*.jpg -o -iname \*.gif \)

Uso la opción -iname para que la coincidencia no distinga entre mayúsculas y minúsculas.

smokinguns
fuente
1
iname no está disponible en todas las versiones de find.
JOTN
1

Si bien todas las respuestas son más o menos iguales, no las encuentro legibles con nombres múltiples y operadores booleanos intermedios.

Creo que esta puede ser una solución más elegante:

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$"

Vamos a romper esto

  • find . encuentra todos los archivos de forma recursiva en la ruta actual (cambie a otra ruta si es necesario)
  • -type flimita la búsqueda solo a archivos (no es un aumento de velocidad demasiado, pero aún así ...)
  • | grep -EHe utilizado esto para conseguir grep reconocer o ( |) operador de Mac OS X que utiliza FreeBSD grep , GNU grep no necesita que (cheque en su manarchivo).
  • "\.java$|\.cpp$|\.c$"expresión regular que incluye archivos cuyos extremos nombre con .java, .cppy .c(los complementos que necesita)

Luego puede canalizar la lista resultante para su posterior procesamiento, por ejemplo

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$" | xargs sed -i '' $'/s/\r$//'

Este ejemplo elimina la línea DOS / Windows CRLFque finaliza para OS X / Linux LF(esta también es la sedsintaxis de OS X , verifique los detalles de su versión).

MacMladen
fuente
Quería encontrar todos los tipos de archivos de video usando 25 parámetros de coincidencia de extensión diferentes. Este fue el único enfoque que funcionó para mí. (Ubuntu 14.04 LTS)
Elder Geek