202 votes

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

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

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

Comment modifier cette chaîne pour ne pas trouver uniquement les fichiers .jpg ?

215voto

Dennis Williamson Points 105818
find /path/to -regex ".*\.\(jpg\|gif\|png\|jpeg\)" > log

11 votes

Cela ne fonctionne pas pour moi sur mac, mais fonctionne avec l'option -E (étendue) (peut-être que le pipe est une fonctionnalité étendue ?): find -E /path/to -iregex ".* \. (jpg|gif|png|jpeg)" > journal

148voto

JoseK Points 20075
find /path/to/  \( -iname '*.gif' -o -iname '*.jpg' \) -print0

fonctionnera. Il y a peut-être un moyen plus élégant.

16 votes

-iname ne serait pas sensible à la casse

1 votes

@Gerald : Il est probable que vous deviez regrouper votre expression OR entre des parenthèses échappées : find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -exec ls -l {} \; sinon l'exécution ne s'applique qu'à la dernière partie ( -iname '*.jpg' dans ce cas).

0 votes

C'est une remarque importante. find /path/to/ -iname '*.gif' -o -iname '*.jpg' -print0 n'imprimera que les fichiers jpg ! Vous avez besoin de parenthèses ici : find /path/to/ \( -iname '*.gif' -o -iname '*.jpg' \) -print0

34voto

tboyce12 Points 94

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

El -E vous évite d'avoir à échapper les parenthèses et les tuyaux dans votre regex.

3 votes

Ma trouvaille n'a pas cela -E

1 votes

Hmmm le -E L'option indique find pour 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.

8 votes

Fonctionne également sur Mac OS.

12voto

unutbu Points 222216
find /path/to/ -type f -print0 | xargs -0 file | grep -i image

Cela utilise le file pour essayer de reconnaître le type de fichier, indépendamment du nom de fichier (ou de l'extension).

Si /path/to ou un nom de fichier contient la chaîne de caractères image alors la méthode ci-dessus peut renvoyer des résultats erronés. Dans ce cas, je suggère

cd /path/to
find . -type f -print0 | xargs -0 file --mime-type | grep -i image/

0 votes

Désolé, j'ai fait un clic errant et je ne peux apparemment pas annuler le downvote... :(

8voto

ghostdog74 Points 86060
find /path -type f \( -iname "*.jpg" -o -name "*.jpeg" -o -iname "*gif" \)

2 votes

Pourriez-vous expliquer pourquoi vous avez ajouté les parenthèses (échappées) autour des paramètres nom/nom ?

0 votes

Une raison pour cette incohérence ? -iname *.jpg , -o -name *.jpeg , -o -iname *gif ont tous un format légèrement différent.

0 votes

Si vous pouviez au moins expliquer les différences avec les autres réponses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X