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

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)'

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\)$'

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.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.