Comment répertorier tous les fichiers source (* .c, * .cpp, * .h)

15

Je voudrais trouver des fichiers sources (* .c, * .cpp, * .h) qui contiennent dans Linux / MinGW / Cygwin, et récursivement dans tous les sous-répertoires.

Mon idée de base consiste à utiliser findet grep. Cependant, la construction d'une expression régulière qui peut vérifier le nom de fichier donné est soit * .c, * .cpp ou * .h n'est pas facile. Pourrais-tu m'aider?

Nullptr
la source

Réponses:

14

Cela devrait fonctionner:

find Linux/MinGW/Cygwin -name '*.c' -o -name '*.cpp' -o -name '*.h'
cYrus
la source
5
find -regex '.*/.*\.\(c\|cpp\|h\)$'
En pause jusqu'à nouvel ordre.
la source
Que fait le $à la fin de la commande?
Ali
2
@Ali: Il ancre l'expression régulière à la fin de la ligne (il empêche de trouver des fichiers nommés foo.cpp.oldpar exemple).
pause jusqu'à nouvel ordre.
1

J'utiliserais:

find . -regex '.*\.\(c\|cpp\|h\)$' -print
rouble
la source
1
Dans mon macbook, le script sans a -Ene trouve rien. vous pourriez avoir besoin d'ajouter un -E (comme étendu) pour le rendre plus portable, tout comme find -E . -regex '.*\.(c|h|cpp)' -print. ;-)
pambda
1

Rapide et sale, et évite les noms de répertoire:

find . -type f -name *.[c\|h]
user282564
la source
2
Il y a trois problèmes avec cette commande: 1. Elle ne trouvera pas de *.cppfichiers. 2. Il trouvera des *.|fichiers. 3. Le glob se développera s'il y a des fichiers correspondants dans le répertoire courant. Citer empêche cela.
Dennis
1

Vous pouvez utiliser une expression rationnelle légèrement plus simple:

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

J'utilise un mac pro qui fonctionne également en bash. Mais chaque fois que je tape dans la ligne de commande:

find -name

il dit option illégale. Je l'ai donc simplement simplifié comme suit:

find *.c *.cpp *.h

et j'ai trouvé que ça fonctionnait vraiment!

Schawn
la source