Comment utiliser la commande find pour rechercher plusieurs extensions

Réponses:

153

Utilisez l' -oindicateur entre différents paramètres.

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) fonctionne comme un charme.

REMARQUE Il doit y avoir un espace entre le support et son contenu, sinon cela ne fonctionnera pas.

Explication:

  • type -f - rechercher uniquement des fichiers (pas des répertoires)
  • \(- nécessaire pour l' type -fapplication à tous les arguments
  • -o - opérateur logique OU
  • -iname- comme -name, mais la correspondance est insensible à la casse
Shadur
la source
Avez-vous besoin des parenthèses. La commande fonctionne pour moi sans eux. Sont-ils nécessaires pour certains coquillages?
MikeD
2
@miked La commande "fonctionnera" sans eux, oui, mais vous obtiendrez des hits sur les répertoires se terminant par .png, ainsi que sur les fichiers se terminant par .jpg, ce qui n'est pas exactement ce qui était prévu.
Shadur
1
Merci de clarifier! Le type -fne s'étend pas et ne s'applique pas aux deux expressions sans les parenthèses. Donc, cela find ./ -type f -iname \*.jpg -o -type f -iname \*.pngfonctionne aussi ... bien que ce soit deux caractères plus longs :-)
MikeD
2
C'est une question de priorité des opérateurs. Tout comme a * b + cest différent dea * (b + c)
Shadur
2
@jdhao Bonne prise, amendé.
Shadur
86

Vous pouvez combiner des critères avec -oceux suggérés par Shadur . Notez que -ola priorité est inférieure à la juxtaposition, vous aurez donc peut-être besoin de parenthèses.

find . -name '*.jpg' -o -name '*.png'
find . -mtime -7 \( '*.jpg' -o -name '*.png' \)  # all .jpg or .png images modified in the past week

Sous Linux, vous pouvez -regexcombiner des extensions de manière modérée. La syntaxe par défaut des expressions rationnelles est Emacs (expressions rationnelles de base plus quelques extensions telles que l' \|alternance); il y a une option pour passer aux expressions rationnelles étendues .

find -regex '.*\.\(jpg\|png\)'
find -regextype posix-extended -regex '.*\.(jpg|png)'

Sous FreeBSD, NetBSD et OSX, vous pouvez l’utiliser en -regexcombinaison avec -Eles expressions rationnelles étendues.

find -E . -regex '.*\.(jpg|png)'
Gilles
la source
Il est toujours préférable d'utiliser -inameau lieu de -name- alors vous allez aussi capturer image.JPGetimage.PnG
ccpizza
40

Ceci est plus correct:

find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'
Dimitry
la source
10
Pourquoi dites-vous que c'est "plus" correct?
Kevin
2
@ Kevin je suppose parce que les -iregexmatchs jpgaussi bien JPG Jpg jpGet tel. Je pense que le $n'est pas nécessaire.
ott--
Cela fonctionne bien sur MinGW .
Peter Mortensen
2
D'abord, vous avez omis le dossier de recherche comme premier argument, ce qui génèrera une erreur. Deuxièmement, sur OSX, échapper à la parenthèse ne fonctionnera pas et ceci devrait être utilisé à la place: find -E . -iregex '.*\.(jpg|png|gif)'comme le montre la réponse de @ sorin.
ccpizza
8

Pour que ce soit clair, la seule option qui fonctionne sous Linux, Unix et Mac OS est la suivante:

find -E . -regex '.*\.(jpg|png)'

C'est parce que la version OS X est un peu différente, mais il est important d'écrire des choses qui vont bien sur la plupart des plateformes.

sorin
la source
2
-E drapeau n'est pas valide pour trouver sur Ubuntu 14.04
gogaman
L'indicateur -E n'est pas valide non plus sur MinGW (au moins la version / configuration pour laquelle j'ai essayé (configuration par défaut pour une version particulière)).
Peter Mortensen
Quelle partie de -type f \( -iname \*.png -o -iname \*.jpg\)ne fonctionne pas sur OSX?
Shadur
-3
/\.(jpe?g|png|gif|bmp)$/i;

Utilise le.

Rohit Gour
la source
5
Vous devrez peut-être expliquer un peu cela.
chaos