Sortie de commande Linux en tant que paramètre d’une autre commande

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:

  • Comment afficher la sortie d’une commande Linux sur stdout et la diriger également vers une autre commande?
  • Utiliser la sortie de la commande bash (avec pipe) comme paramètre pour une autre commande

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.
  • Comme 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 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.