Cómo enumerar todos los archivos de origen (* .c, * .cpp, * .h)

15

Me gustaría encontrar archivos fuente (* .c, * .cpp, * .h) que contengan en Linux / MinGW / Cygwin, y de forma recursiva en todos los subdirectorios.

Mi idea básica es usar findy grep. Sin embargo, construir una expresión regular que pueda verificar el nombre de archivo dado es * .c, * .cpp o * .h no es fácil. ¿Podrías ayudarme?

Nullptr
fuente

Respuestas:

14

Esto debería funcionar:

find Linux/MinGW/Cygwin -name '*.c' -o -name '*.cpp' -o -name '*.h'
Ciro
fuente
5
find -regex '.*/.*\.\(c\|cpp\|h\)$'
Pausado hasta nuevo aviso.
fuente
¿Qué hace el $al final del comando?
Ali
2
@ Ali: Ancla la expresión regular al final de la línea (evita encontrar archivos nombrados, foo.cpp.oldpor ejemplo).
Pausado hasta nuevo aviso.
1

Yo usaría:

find . -regex '.*\.\(c\|cpp\|h\)$' -print
rublo
fuente
1
En mi macbook, el script sin un -Eno puede encontrar nada. Es posible que necesite agregar un -E (como extendido) para hacerlo más portátil, al igual que find -E . -regex '.*\.(c|h|cpp)' -print. ;-)
pambda
1

Rápido y sucio, y evita los nombres de directorio:

find . -type f -name *.[c\|h]
usuario282564
fuente
2
Hay tres problemas con este comando: 1. No encontrará *.cpparchivos. 2. Encontrará *.|archivos. 3. El globo se expandirá si hay archivos coincidentes en el directorio actual. Citar lo impide.
Dennis
1

Puedes usar una expresión regular un poco más simple:

find . -type f -regex ".*\.[ch]\(pp\)?$"
Toni Homedes i Saun
fuente
0

Yo uso un Mac Pro que también funciona en bash. Pero cada vez que escribo en la línea de comando:

find -name

Dice opción ilegal. Entonces lo simplifiqué como:

find *.c *.cpp *.h

y encontré que realmente funcionó!

Schawn
fuente