[pipe] Réutiliser le résultat d'une commande

Résolu
Bonjour, je me demandais s'il était possible de réutiliser le résultat d'une commande avec le pipe et sans passer par un script.

Par exemple, si je veux cherche un fichier et que je veux afficher son contenu, est-il possible de faire quelque chose dans le genre?
file . -name file | cat quelquechose


Sinon j'avais pensé à passer par des fichiers pour stocker les résultats intermédiaires, comme ceci:
find . -name file >> result && cat result | cut -c 3- >> result2 && cat < result2
etc.

Est-ce une mauvaise idée / mauvaise pratique, et y-a-t-il plus simple ?

4 réponses

  1. Je viens de tester, et ça marche parfaitement bien ! C'est exactement ce que je cherchais. Je te remercie !
    1. Modérateur
      De rien, bonne continuation !
  2. Modérateur
    Bonjour,

    Imaginons que le dossier
    ~/toto
    contienne trois fichiers nimmés
    fichier1.txt
    ,
    fichier2.txt
    et
    fichier3.txt
    , contenant respectivement le texte
    coucou1
    ,
    coucou2
    et
    coucou3
    :

    (mando@silk) (~/toto) $ find . -type f
    ./fichier3.txt
    ./fichier1.txt
    ./fichier2.txt


    (mando@silk) (~/toto) $ head fichier*txt
    ==> fichier1.txt <==
    coucou1

    ==> fichier2.txt <==
    coucou2

    ==> fichier3.txt <==
    coucou3


    Dans ce cas :
    • Si tu veux passer simultanément en paramètre à une commande (disons
      cat
      ), i.e. exécuter la commande
      cat fichier1.txt fichier2.txt fichier3.txt
      , tu peux utiliser
      xargs
      qui remet sur une ligne d'arguments les lignes générées sur la sortie standard par la commandes précédant le
      |
      :


    (mando@silk) (~/toto) $ find . -type f | xargs cat
    coucou3
    coucou1
    coucou2
    • Si tu veux itérativement appliquer une commande à chacun de ces fichiers (disons
      echo
      ), tu peux injecter le résultat de ta commande dans une boucle
      for
      :


    (mando@silk) (~/toto) $ for x in $(find -type f); do echo $x; done
    ./fichier3.txt
    ./fichier1.txt
    ./fichier2.txt


    Cependant attention ! Des précautions doivent être prises si les arguments, ici tes noms de fichiers, contiennent des espaces. Pour plus de détails voir cette discussion.

    Bonne chance
    1. Salut, oui effectivement il y a une faute de frappe, c'est bien
      find
      que je voulais utiliser. Merci à toi.

      Je cherchais une manière de simplifier tout ça justement, pour éviter d'avoir à le faire en 2 fois comme ceci:
      file . -name file

      puis
      cat file

      car en une fois c'est plus simple, afin de pouvoir aller plus vite et d'automatiser certaines tâches. Mais le fait de tout grouper en 1 fois, je ne sais pas si c'est quelque chose qui se fait habituellement ?
      1. Salut,

        La commande est
        find
        et non
        file
        je crois.

        La seconde commande est compliquée, rien qu'à lire.

        Et la première est inutile. Parce que tu vas chercher un fichier. Soit il est présent, tu l'envoies en lecture par
        cat
        . Soit il est absent et tu devrais avoir une erreur de retour de
        cat
        (je n'ai pas testé).

        En revanche, si tu fais directement :
        cat file
        ça t'évite d'écrire la commande de recherche.