Comment utiliser la commande find pour trouver tous les fichiers avec des extensions de la liste?

185

J'ai besoin de trouver tous les fichiers image du répertoire (gif, png, jpg, jpeg).

find /path/to/ -name "*.jpg" > log

Comment modifier cette chaîne pour trouver non seulement des fichiers .jpg?

Kirzilla
la source

Réponses:

196
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
Suspendu jusqu'à nouvel ordre.
la source
8
Ne fonctionne pas pour moi sur mac, mais fonctionne avec l'option -E (étendue) (peut-être que le tube est une fonctionnalité étendue?): Find -E / path / to -iregex ". * \. (Jpg | gif | png | jpeg) "> log
ling
139
find /path/to/  \( -iname '*.gif' -o -iname '*.jpg' \) -print0

marchera. Il pourrait y avoir une manière plus élégante.

JoseK
la source
16
-iname serait insensible à la casse
Chris Koston
1
@Gerald: Il est probable que vous deviez regrouper votre expression OR entre parenthèses échappées: find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \;sinon l'exécutable ne s'applique qu'à la dernière partie ( -iname '*.jpg' dans ce cas).
Suspendu jusqu'à nouvel ordre.
C'est une remarque importante. find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0n'imprimera que les fichiers jpg! Vous avez besoin de parenthèses ici:find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0
Anne van Rossum le
31

find -E /path/to -regex ".*\.(jpg|gif|png|jpeg)" > log

Le -Evous évite d'avoir à échapper aux parens et aux tuyaux de votre regex.

tboyce12
la source
3
ma trouvaille n'a pas ceci -E
wieczorek1990
1
Hmmm l' -Eoption indique findd'utiliser des "expressions régulières étendues". Plusieurs autres outils ont une option similaire, mais je ne suis pas sûr que cette option soit disponible sur toutes les distributions UNIX.
tboyce12
8
Fonctionne également sur Mac OS.
c.gutierrez
3
@ tboyce12 travail sur ubuntu, je peux préciser la -regextype pour simplifier l'expression regex: find . -regextype posix-extended -regex ".*\.(jpg|gif|png|jpeg)".
doub1ejack
1
@cjm Peut-être find -E /path/to -iregex ".*\.(jpg|gif|png|jpeg)" > log. L'utilisation du -iregexdrapeau indique de findfaire correspondre la casse de manière insensible.
tboyce12
11
find /path/to/ -type f -print0 | xargs -0 file | grep -i image

Cela utilise la filecommande pour essayer de reconnaître le type de fichier, quel que soit le nom de fichier (ou l'extension).

Si /path/toou un nom de fichier contient la chaîne image, alors ce qui précède peut renvoyer de faux hits. Dans ce cas, je suggérerais

cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/
unutbu
la source
Désolé, il y a eu un clic errant et je ne peux apparemment pas annuler le vote défavorable ... :(
Mark Simpson
6
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)
ghostdog74
la source
2
Pouvez-vous expliquer pourquoi vous avez ajouté les parenthèses (échappées) autour des paramètres name / iname?
Bart Kleijngeld
Une raison de l'incohérence? -iname *.jpg, -o -name *.jpeg, -o -iname *gifTous ont un format légèrement différent.
Panier abandonné
si vous pouviez au moins expliquer les différences avec d'autres réponses.
el-teedee
6

En complément de la réponse de @Dennis Williamson ci-dessus, si vous voulez que la même expression régulière soit insensible à la casse pour les extensions de fichier, utilisez -iregex:

find /path/to -iregex ".*\.\(jpg\|gif\|png\|jpeg\)" > log
TCW
la source
6

Sur l'utilisation de Mac OS

find -E packages  -regex ".*\.(jpg|gif|png|jpeg)"
7ynk3r
la source
3
find -regex ".*\.\(jpg\|gif\|png\|jpeg\)"
shrikant
la source
-1

dans le cas où les fichiers n'ont pas d'extension, nous pouvons rechercher le type de fichier mime

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }'

où (audio | video | matroska | mpeg) sont des types mime regex

& si vous souhaitez les supprimer:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 ~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

ou supprimez tout le reste sauf ces extensions:

find . -type f -exec file -i {} + | awk -F': +' '{ if ($2 !~ /audio|video|matroska|mpeg/) print $1 }' | while read f ; do
  rm "$f"
done

remarquez le! ~ au lieu de ~

k. Biche
la source