Como listar todos os arquivos de origem (* .c, * .cpp, * .h)

15

Eu gostaria de encontrar arquivos de origem (* .c, * .cpp, * .h) que contenham Linux / MinGW / Cygwin e recursivamente em todos os subdiretórios.

Minha idéia básica é usar finde grep. No entanto, a criação de uma expressão regular que pode verificar o nome do arquivo é * .c, * .cpp ou * .h não é fácil. Você poderia me ajudar?

Nullptr
fonte

Respostas:

14

Isso deve funcionar:

find Linux/MinGW/Cygwin -name '*.c' -o -name '*.cpp' -o -name '*.h'
cYrus
fonte
5
find -regex '.*/.*\.\(c\|cpp\|h\)$'
Pausado até novo aviso.
fonte
O que faz o $final do comando?
Ali
2
@ Ali: Ele ancora o regex no final da linha (impede a localização de arquivos nomeados foo.cpp.oldpor exemplo).
Pausado até novo aviso.
1

Eu usaria:

find . -regex '.*\.\(c\|cpp\|h\)$' -print
rublo
fonte
11
No meu macbook, o script sem a -Enão consegue encontrar nada. pode ser necessário adicionar -E (como estendido) para torná-lo mais portátil, assim como find -E . -regex '.*\.(c|h|cpp)' -print. ;-)
pambda
1

Rápido e sujo, e evita nomes de diretório:

find . -type f -name *.[c\|h]
user282564
fonte
2
Existem três problemas com este comando: 1. Ele não encontra *.cpparquivos. 2. Ele encontrará *.|arquivos. 3. O glob será expandido se houver arquivos correspondentes no diretório atual. Citar evita isso.
Dennis
1

Você pode usar uma regex um pouco mais simples:

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

Eu uso um mac pro que também funciona no bash. Mas toda vez que digito na linha de comando:

find -name

diz opção ilegal. Então, eu apenas simplifiquei como:

find *.c *.cpp *.h

e achei que realmente funcionou!

Schawn
fonte