Je voudrais passer la liste des éléments d’une commande en tant que paramètre d’une autre commande. J’ai trouvé d’autres pages:
mais ils semblent être plus complexes.
Je voudrais juste copier un fichier à chaque résultat d’un appel à la commande de find
Linux.
Qu’est-ce qui ne va pas ici?
find . -name myFile 2>&1 | cp /home/myuser/myFile $1
Merci
Voici ce que tu veux:
find . -name myFile -exec cp /home/myuser/myFile {} ';'
Une ventilation / explication de ceci:
find
: invoquer la commande find .
: lance la recherche à partir du répertoire de travail actuel. -name myFile
: recherche les fichiers avec le nom explicite myFile
-exec
: pour les résultats de la recherche, exécutez des commandes supplémentaires avec eux cp /home/myuser/myFile {}
: copie /home/myuser/myFile
pour écraser chaque résultat renvoyé par find
à; penser à {}
où chaque résultat de recherche va. ';'
: utilisé pour séparer les différentes commandes à exécuter après find
Il existe plusieurs manières de résoudre ce problème, selon que vous devez vous préoccuper des fichiers contenant des espaces ou d’autres caractères spéciaux.
Si aucun des noms de fichiers ne contient d’espaces ou de caractères spéciaux (ils ne sont composés que de lettres, de chiffres, de tirets et de traits de soulignement), la solution suivante est simple. Vous pouvez utiliser $(command)
pour exécuter une commande et substituer les résultats aux arguments d’une autre commande. Le shell divisera le résultat en espaces, tabulations ou nouvelles lignes, et assignera chaque valeur à $f
, puis exécutera 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 l’option find -exec
. Vous passez la -exec command args
, en mettant {}
où vous voulez que le nom de fichier soit substitué et en mettant fin aux arguments avec un ;
. Vous devez citer le {}
et ;
pour que la shell ne les interprète pas.
find . -name myFile -exec cp something "{}" \;
Parfois -exec
n’est pas suffisant. Par exemple, dans cette question , ils souhaitaient utiliser l’extension de paramètre Bash pour calculer le nom de fichier. Pour ce faire, vous devez passer -exec bash -c 'your command'
, mais vous rencontrerez des problèmes avec la substitution {}
. Pour résoudre ce problème, vous pouvez utiliser -print0
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 les diriger vers une boucle while while read
qui sépare les parameters sur les -print0
null:
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 depuis son stream d’entrée au terminal, il utilise simplement les arguments sur la ligne de commande.
Vous voulez soit utiliser xargs
avec le tube ou find
l’argument exec
au lieu de tubes.