web-dev-qa-db-fra.com

Comment utiliser la commande find pour rechercher plusieurs extensions

Je peux obtenir toutes les images jpg en utilisant:

find . -name "*.jpg"  

Mais comment puis-je également ajouter des fichiers png aux résultats?

143
wong2

Utilisez l'indicateur -o Entre les différents paramètres.

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

NOTE Il doit y avoir un espace entre le support et son contenu ou il a gagné ça marche pas.

Explication:

  • -type f - recherche uniquement les fichiers (pas les répertoires)
  • \( & \) - sont nécessaires pour que -type f S'applique à tous les arguments
  • -o - logique OR opérateur
  • -iname - comme -name, Mais la correspondance ne respecte pas la casse
176
Shadur

Vous pouvez combiner des critères avec -o as suggéré par Shadur . Notez que -o a une priorité plus faible que la juxtaposition, vous devrez donc peut-être des 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 utiliser -regex pour combiner les extensions de manière plus concise. La syntaxe regexp par défaut est Emacs ( regexps de base plus quelques extensions telles que \| pour l'alternance); il y a une option pour passer à regexps étendus .

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

Sur FreeBSD, NetBSD et OSX, vous pouvez utiliser -regex combiné avec -E pour les expressions rationnelles étendues.

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

C'est plus correct:

find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'
44
Dimitry

Pour être clair, la seule option qui fonctionne sous Linux, Unix et macOS est:

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

C'est parce que la version OS X est un peu différente, mais c'est important d'écrire des choses qui fonctionnent bien sur la plupart des plates-formes.

9
sorin