La page de manuel (ou le manuel GNU en ligne ) explique à peu près tout.
commande find -exec {} \;
Pour chaque résultat, command {}
est exécuté. Toutes les occurrences de {}
sont remplacées par le nom de fichier. ;
est précédé d'une barre oblique pour empêcher le shell de l'interpréter.
commande find -exec {} +
Chaque résultat est ajouté command
et exécuté par la suite. En tenant compte des limitations de longueur de commande, je suppose que cette commande peut être exécutée plus de fois, avec la page de manuel me soutenant:
le nombre total d'appels de la commande sera bien inférieur au nombre de fichiers correspondants.
Notez cette citation de la page de manuel:
La ligne de commande est construite à peu près de la même manière que xargs construit ses lignes de commande
C'est pourquoi aucun caractère n'est autorisé entre {}
et à l' +
exception des espaces. +
fait que find détecte que les arguments doivent être ajoutés à la commande comme xargs
.
La solution
Heureusement, l'implémentation GNU de mv
peut accepter le répertoire cible comme argument, avec l'un -t
des paramètres ou le paramètre le plus long --target
. Son utilisation sera:
mv -t target file1 file2 ...
Votre find
commande devient:
find . -type f -iname '*.cpp' -exec mv -t ./test/ {} \+
Depuis la page de manuel:
commande -exec;
Exécuter la commande; true si l'état 0 est renvoyé. Tous les arguments suivants à rechercher sont considérés comme des arguments de la commande jusqu'à ce qu'un argument consistant en `; ' est rencontré. La chaîne «{}» est remplacée par le nom du fichier en cours de traitement partout où il apparaît dans les arguments de la commande, pas seulement dans les arguments où il est seul, comme dans certaines versions de find. Ces deux constructions peuvent devoir être échappées (avec un `\ ') ou entre guillemets pour les protéger de l'expansion par le shell. Voir la section EXEMPLES pour des exemples d'utilisation de l'option -exec. La commande spécifiée est exécutée une fois pour chaque fichier correspondant. La commande est exécutée dans le répertoire de départ. Il existe des problèmes de sécurité inévitables entourant l'utilisation de l'action -exec; vous devriez utiliser l'option -execdir à la place.
-exec commande {} +
Cette variante de l'action -exec exécute la commande spécifiée sur les fichiers sélectionnés, mais la ligne de commande est construite en ajoutant chaque nom de fichier sélectionné à la fin; le nombre total d'appels de la commande sera bien inférieur au nombre de fichiers correspondants. La ligne de commande est construite à peu près de la même manière que xargs construit ses lignes de commande. Une seule instance de «{}» est autorisée dans la commande. La commande est exécutée dans le répertoire de départ.