web-dev-qa-db-fra.com

find -name "* .xyz" -o -name "* .abc" -exec à exécuter sur tous les fichiers trouvés, pas seulement le dernier suffixe spécifié

J'essaye de courir

find ./ -name "*.xyz" -o -name "*.abc" -exec cp {} /path/i/want/to/copy/to

En réalité, c'est une liste plus longue d'extensions de noms, mais je ne sais pas ce qui compte pour cet exemple. Fondamentalement, je voudrais copier tous ceux trouvés dans un autre/chemin/i/want/to/copy/to. Cependant, il semble que seul le test du nom de famille soit exécuté dans la liste.

Si je supprime la partie -exec, toutes les variantes de fichiers que je m'attends à trouver sont imprimées.

Comment puis-je le faire passer le complément complet des fichiers trouvés à -exec?

40
atxdba

find fonctionne en évaluant les expressions que vous lui donnez jusqu'à ce qu'il puisse déterminer la valeur de vérité (vraie ou fausse) de l'expression entière. Dans votre cas, vous procédez essentiellement comme suit, car par défaut, il ET les expressions ensemble.

-name "*.xyz" OR ( -name "*.abc" AND -exec ... )

Quoth la page de manuel:

GNU find recherche l'arborescence de répertoires enracinée à chaque nom de fichier donné en évaluant l'expression donnée de gauche à droite, selon les règles de priorité (voir la section OPÉRATEURS), jusqu'à ce que le résultat soit connu (le côté gauche est faux pour les opérations et, true pour ou), auquel cas find passe au nom de fichier suivant.

Cela signifie que si le nom correspond à *.xyz, il n'essaiera même pas de vérifier ce dernier -name test ou -exec, puisque c'est déjà vrai.

Ce que vous voulez faire, c'est appliquer la priorité, ce que vous pouvez faire entre parenthèses. Chose ennuyeuse, vous devez également utiliser des barres obliques inverses pour les échapper sur le shell:

find ./ \( -name "*.xyz" -o -name "*.abc" \) -exec cp {} /path/i/want/to/copy/to \;
54
Dan Fego

Plus utilisable que la solution de Jaypal serait peut-être:

   find ./ -regex ".*\.\(jpg\|png\)" -exec cp {} /path/to
16
user unknown
find . \( -name "*.xyz" -o -name "*.abc" \) -exec cp {} /path/i/want/to/copy/to \;
8
Rob Wouters