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?

Réponses:


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

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.


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.


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/

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" \)

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

6

Sur l'utilisation de Mac OS

find -E packages  -regex ".*\.(jpg|gif|png|jpeg)"


-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 ~

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.