Voici ce que vous voulez :
find . -name myFile -exec cp /home/myuser/myFile {} ';'
Une ventilation / explication de ceci :
find
:appel de la commande find.
:lancer la recherche à partir du répertoire de travail actuel.- Étant donné qu'aucun indicateur de profondeur n'est spécifié, cela recherchera de manière récursive tous les sous-dossiers
-name myFile
:recherche les fichiers avec le nom explicitemyFile
-exec
:pour les résultats de la recherche, effectuez des commandes supplémentaires avec euxcp /home/myuser/myFile {}
:copie/home/myuser/myFile
pour écraser chaque résultat renvoyé parfind
à; pensez à{}
comme où va chaque résultat de recherche.';'
:utilisé pour séparer les différentes commandes à exécuter aprèsfind
Il existe plusieurs façons de résoudre ce problème, selon que vous devez vous soucier des fichiers contenant des espaces ou d'autres caractères spéciaux dans leurs noms.
Si aucun des noms de fichiers ne contient d'espaces ou de caractères spéciaux (ils ne sont constitués que de lettres, de chiffres, de tirets et de traits de soulignement), voici une solution simple qui fonctionnera. Vous pouvez utiliser $(command)
pour exécuter une commande et substituer les résultats dans les arguments d'une autre commande. Le shell divisera le résultat en espaces, tabulations ou retours à la ligne, et for
attribuer chaque valeur à $f
à tour de rôle, et exécutez la commande sur chaque valeur.
for f in $(find . -name myFile)
do
cp something $f
done
Si vous avez des espaces ou des tabulations, vous pouvez utiliser le -exec
de find option. Vous passez -exec command args
, en mettant {}
où vous voulez que le nom de fichier soit substitué, et en terminant les arguments avec un ;
. Vous devez citer le {}
et ;
afin que le shell ne les interprète pas.
find . -name myFile -exec cp something "{}" \;
Parfois -exec
c'est insuffisant. Par exemple, dans cette question, ils voulaient utiliser l'expansion des paramètres Bash pour calculer le nom de fichier. Pour ce faire, vous devez passer -exec bash -c 'your command'
, mais vous rencontrerez alors des problèmes de citation avec le {}
substitution. Pour résoudre ce problème, vous pouvez utiliser -print0
à partir de find
pour imprimer les résultats délimités par des caractères nuls (qui ne sont pas valides dans les noms de fichiers), et le diriger vers un while read
boucle qui divise les paramètres sur les valeurs nulles :
find . -name myFile -print0 | (while read -d $'\0' f; do
cp something "$f"
done)
Le tube enverra la sortie d'un programme à l'entrée d'un autre. cp
ne lit pas à partir de son flux d'entrée au niveau du terminal, il utilise simplement les arguments de la ligne de commande.
Vous voulez soit utiliser xargs
avec le tuyau ou find
est exec
argument au lieu de tubes.
find . -name myFile 2>&1 | xargs -I {} cp /home/myuser/myFile {}
Remarque :option -I {}
définit {}
comme espace réservé, vous pouvez également utiliser un autre espace réservé s'il est en conflit avec la commande à exécuter.