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?
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 \;
Plus utilisable que la solution de Jaypal serait peut-être:
find ./ -regex ".*\.\(jpg\|png\)" -exec cp {} /path/to
find . \( -name "*.xyz" -o -name "*.abc" \) -exec cp {} /path/i/want/to/copy/to \;