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

Signaler
Messages postés
175
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
8 avril 2021
-
Messages postés
29703
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
8 avril 2021
-
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

Messages postés
1564
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
11 avril 2021
128
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.
Messages postés
175
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
8 avril 2021
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 ?
Messages postés
29703
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
8 avril 2021
7 066
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
Messages postés
175
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
8 avril 2021
1
Je viens de tester, et ça marche parfaitement bien ! C'est exactement ce que je cherchais. Je te remercie !
Messages postés
29703
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
8 avril 2021
7 066
De rien, bonne continuation !