Utilisation de `find` pour plusieurs extensions de fichier

16

J'utilise la commande suivante pour compter les lignes de texte dans les fichiers JAVA:

find . -name '*.java' | xargs wc -l

Comment puis-je modifier les findparamètres de commande pour correspondre à plusieurs extensions de fichier? Par exemple, j'aimerais utiliser l'opération ci-dessus pour les fichiers CPP, C et H.

Xavier
la source
Cette question concerne en fait la findcommande, car c'est là que vous recherchez les fichiers correspondants.
iglvzx
1
En outre, utiliser la find -print0 | xargs -0construction ou encore mieux et plus simple: find . -name '*.cpp' -o -name '*.c' -o -name '*.h' -exec wc -l {} +. Cela évitera tout problème de nom de fichier (espaces vides, nouvelles lignes, etc.) et est (très) une bonne coutume.
Daniel Andersson

Réponses:

16

Utilisez l' -ooption pour un OU. Par exemple, ce serait la liste .cpp, .cet les .hfichiers:

find . -name \*.cpp -o -name \*.c -o -name \*.h
JOTN
la source
Ah. Il *n'est plus nécessaire de s'échapper s'il est formaté en tant que code. Totalement ignoré cela. :)
iglvzx
Oui, il a fallu trois modifications par deux personnes, mais nous l'avons eu.
JOTN
2
Cela ne fonctionnait pas pour moi sur OSX (ne correspondait qu'au dernier nom * .ext) - j'ai dû utiliser des parenthèses comme suggéré par @smokinguns ci-dessous.
Gilead
2

Vous devrez utiliser l'option -o. Par exemple, l'instruction ci-dessous trouve tous les fichiers png, jpg et gif dans un dossier.

find . \( -iname \*.png -o -iname \*.jpg -o -iname \*.gif \)

J'utilise l'option -iname pour que la correspondance soit insensible à la casse.

fumeurs
la source
1
iname n'est pas disponible sur toutes les versions de find.
JOTN
1

Bien que toutes les réponses soient plus ou moins les mêmes, je ne les trouve pas lisibles avec plusieurs opérateurs de nom et booléens entre les deux.

Je pense que cela peut être une solution plus élégante:

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$"

Brisons ça

  • find . trouve tous les fichiers de manière récursive dans le chemin actuel (changez de chemin si vous en avez besoin)
  • -type frestreint la recherche uniquement aux fichiers (pas trop de gain de vitesse, mais quand même ...)
  • | grep -EJ'ai utilisé cela pour obtenir la reconnaissance grep ou l'| opérateur ( ) dans Mac OS X qui utilise FreeBSD grep , GNU grep n'en a pas besoin (vérifiez votre manfichier).
  • "\.java$|\.cpp$|\.c$"expression régulière qui inclut les fichiers dont les extrémités nom avec .java, .cppet .c(les add dont vous avez besoin)

Vous pouvez ensuite diriger la liste résultante pour un traitement ultérieur, par exemple

$ find . -type f | grep -E "\.java$|\.cpp$|\.c$" | xargs sed -i '' $'/s/\r$//'

Cet exemple supprime la CRLFfin de ligne DOS / Windows pour OS X / Linux LF(il s'agit également de la sedsyntaxe OS X , vérifiez les spécificités de votre version).

MacMladen
la source
Je voulais trouver tous les types de fichiers vidéo en utilisant 25 paramètres de correspondance d'extension différents. C'était la seule approche qui a fonctionné pour moi. (Ubuntu 14.04 LTS)
Elder Geek
0

Utilisation

find path/to/dir -name "*.ext1" -o -name "*.ext2"

Explication

  1. Le premier paramètre est le répertoire que vous souhaitez rechercher.
  2. Par défaut, la findrécursivité.
  3. Le -oreprésente -or. Donc, ci-dessus signifie rechercher ce caractère générique OU celui-ci. Si vous n'avez qu'un seul motif, alors pas besoin -o.
  4. Les guillemets autour du motif générique sont obligatoires.
Shital Shah
la source