GNU/Linux >> Tutoriels Linux >  >> Linux

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

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 explicite myFile
  • -exec :pour les résultats de la recherche, effectuez des commandes supplémentaires avec eux
  • cp /home/myuser/myFile {} :copie /home/myuser/myFile pour écraser chaque résultat renvoyé par find à; pensez à {} comme où va chaque résultat de recherche.
  • ';' :utilisé pour séparer les différentes commandes à exécuter après find

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.


Linux
  1. Comment affecter la sortie d'une commande Linux à une variable

  2. Comment enregistrer la sortie de la commande dans un fichier sous Linux

  3. Commande Linux mv

  4. Linux du command

  5. Exemples de commande de temps Linux

Commande Linux Finger pour trouver les détails de l'utilisateur

Commande iftop sous Linux

Commande lsblk sous Linux

Comment trouver une adresse IP dans la ligne de commande Linux

Rechercher la commande sous Linux/UNIX

Exemples de commandes echo Linux