essayez quelque chose comme ça :
find /home/mine -iname "*.png" -printf "%P\n " | xargs -I % -n1 cp % /home/mine/pngcoppies/copy%
Pour voir ce qui se passe lorsque vous exécutez la recherche, tapez simplement set -xv
-x :Affiche les commandes et leurs arguments au fur et à mesure de leur exécution.
-v :imprime les lignes d'entrée du shell au fur et à mesure qu'elles sont lues.
Voici ce que j'ai :
find . -name "*.xml" -exec echo {} \;
Donne la sortie :
./log.xml
./svnLog.xml
Et quand j'essaye :
set -xv
find . -name "*.xml" -exec echo {} \;
J'obtiens :
find . -name "*.xml" -exec echo {} \;
+ find . -name '*.xml' -exec echo '{}' ';'
./log.xml
./svnLog.xml
Et puis find execute echo en passant le nom de fichier trouvé au lieu du littéral :'{}'
mais quand vous ajoutez quelque chose au {}
comme ci-dessous :
find . -name "*.xml" -exec echo something{} \;
+ find . -name '*.xml' -exec echo 'something{}' ';'
something{}
something{}
Ici l'écho est exécuté deux fois pour les 2 fichiers xml que j'ai et puisqu'il n'y a plus de '{}'
est la liste des paramètres de l'exec, elle ne sera pas remplacée. donc nous avons le echo 'something{}'
pour chaque fichier trouvé.
Pour faire face à cela, vous pouvez penser à exécuter echo en lui passant le nom du fichier en paramètre comme par exemple :
sh -xvc 'echo sothing/$0' filename
Nous savons déjà ce que vaut -x
et -v
. -c
est d'obtenir la commande à partir de la chaîne qui la suit (man sh
)
donc le résultat est :
sh -xvc 'echo somthing/$0' filename
+ sh -xvc 'echo somthing/$0' filename
echo somthing/$0
+ echo somthing/filename
sothing/filename
J'ai utilisé 'echo somthing/$0
' entre ' ' pour que $0 ne soit pas développé par le shell actuel. essayez avec " " et vous verrez l'expansion de $0;)
Donc, pour revenir à votre "problème", la recherche doit être formatée comme ci-dessous :
find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;
Et nous obtiendrons :
find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;
+ find . -name '*.xml' -exec sh -xvc 'echo sothing/$0' '{}' ';'
echo sothing/$0
+ echo sothing/./log.xml
sothing/./log.xml
echo sothing/$0
+ echo sothing/./svnLog.xml
sothing/./svnLog.xml
Comme nous pouvons le voir, le find va exécuter le shell cammand echo sothing/$0
en lui passant '{}'
(remplacé par le nom du fichier trouvé par find) on obtient donc le echo sothing/./log.xml
souhaité
set +xv
pour supprimer le mode verbeux, on obtient :
find . -name "*.xml" -exec sh -c 'echo "cp $0 someWhereElse/$0"' {} \;
cp ./log.xml someWhereElse/./log.xml
cp ./svnLog.xml someWhereElse/./svnLog.xml
donc dans votre cas, il vous suffit d'exécuter la copie dans un sous shell (ajoutez sh
ou bash
ou votre shell préféré après l'exec) et laissez find
passez le nom du fichier en parapet au dessus;)
find /home/mine -iname "*.png" -exec sh -c 'cp $0 /home/mine/pngcoppies/copy/$0' {} \;
J'espère que cela pourra vous aider et excusez-moi pour mon anglais.
De man find:"Le primaire -execdir est identique au primaire -exec à l'exception que l'utilitaire sera exécuté à partir du répertoire contenant le fichier en cours. Le nom de fichier substitué à la chaîne ``{}'' n'est pas qualifié."
find /home/mine -iname "*.png" -execdir cp {} /home/mine/pngcoppies/copy{} \;