Jak wyświetlić listę wszystkich plików źródłowych (* .c, * .cpp, * .h)

15

Chciałbym znaleźć pliki źródłowe (* .c, * .cpp, * .h), które zawierają Linux / MinGW / Cygwin i rekurencyjnie we wszystkich podkatalogach.

Moim podstawowym pomysłem jest używanie findi grep. Jednak zbudowanie wyrażenia regularnego, które może sprawdzić podaną nazwę pliku to * .c, * .cpp lub * .h nie jest łatwe. Czy możesz mi pomóc?

Nullptr
źródło

Odpowiedzi:

14

To powinno działać:

find Linux/MinGW/Cygwin -name '*.c' -o -name '*.cpp' -o -name '*.h'
Cyrus
źródło
5
find -regex '.*/.*\.\(c\|cpp\|h\)$'
Wstrzymano do odwołania.
źródło
Co robi $pod koniec polecenia?
Ali
2
@Ali: Zakotwicza wyrażenie regularne na końcu linii (uniemożliwia znalezienie plików o nazwie foo.cpp.oldna przykład).
Wstrzymano do odwołania.
1

Użyłbym:

find . -regex '.*\.\(c\|cpp\|h\)$' -print
rubel
źródło
1
Na moim Macbooku skrypt bez -Eniczego nie może znaleźć. możesz potrzebować dodać -E (jako rozszerzenie), aby uczynić go bardziej przenośnym, tak jak find -E . -regex '.*\.(c|h|cpp)' -print. ;-)
pambda
1

Szybki i brudny i pozwala uniknąć nazw katalogów:

find . -type f -name *.[c\|h]
użytkownik 282564
źródło
2
Istnieją trzy problemy z tym poleceniem: 1. Nie znajdzie *.cppplików. 2. Znajdzie *.|pliki. 3. Glob rozszerzy się, jeśli w bieżącym katalogu znajdują się pasujące pliki. Cytowanie temu zapobiega.
Dennis
1

Możesz użyć nieco prostszego wyrażenia regularnego:

find . -type f -regex ".*\.[ch]\(pp\)?$"
Toni Homedes i Saun
źródło
0

Używam Mac Pro, który działa również w bash. Ale za każdym razem, gdy wpisuję w wierszu polecenia:

find -name

mówi nielegalna opcja. Po prostu uprościłem to jako:

find *.c *.cpp *.h

i okazało się, że to naprawdę działało!

Schawn
źródło