Auflisten aller Quelldateien (* .c, * .cpp, * .h)

15

Ich möchte nach Quelldateien (* .c, * .cpp, * .h) suchen, die in Linux / MinGW / Cygwin und rekursiv in allen Unterverzeichnissen enthalten sind.

Meine Grundidee ist findund grep. Es ist jedoch nicht einfach, einen regulären Ausdruck zu erstellen, der den angegebenen Dateinamen überprüft: * .c, * .cpp oder * .h. Könntest du mir helfen?

Nullptr
quelle

Antworten:

14

Das sollte funktionieren:

find Linux/MinGW/Cygwin -name '*.c' -o -name '*.cpp' -o -name '*.h'
cYrus
quelle
5
find -regex '.*/.*\.\(c\|cpp\|h\)$'
Bis auf weiteres angehalten.
quelle
Was macht $der Befehl am Ende?
Ali
2
@Ali: Verankert den regulären Ausdruck am Ende der Zeile (verhindert das Auffinden von Dateien, die foo.cpp.oldbeispielsweise einen Namen haben).
Bis auf weiteres angehalten.
1

Ich würde ... benutzen:

find . -regex '.*\.\(c\|cpp\|h\)$' -print
Rubel
quelle
1
In meinem Macbook kann das Skript ohne a -Enichts finden. Möglicherweise müssen Sie ein -E (wie erweitert) hinzufügen, um es portabler zu machen, genau wie find -E . -regex '.*\.(c|h|cpp)' -print. ;-)
pambda
1

Schnell und schmutzig und vermeidet Verzeichnisnamen:

find . -type f -name *.[c\|h]
user282564
quelle
2
Es gibt drei Probleme mit diesem Befehl: 1. Es werden keine *.cppDateien gefunden. 2. Es werden *.|Dateien gefunden. 3. Der Glob wird erweitert, wenn im aktuellen Verzeichnis übereinstimmende Dateien vorhanden sind. Zitieren verhindert das.
Dennis
1

Sie können einen etwas einfacheren regulären Ausdruck verwenden:

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

Ich benutze einen Mac Pro, der auch in Bash funktioniert. Aber jedes Mal, wenn ich in die Befehlszeile tippe:

find -name

es heißt illegale Option. Also habe ich es einfach so vereinfacht:

find *.c *.cpp *.h

und fand es hat wirklich funktioniert!

Schawn
quelle