| - le pipe sous lunix

Résolu
ilo -  
 ilo -
Bonjour,
SVP comment je peux utiliser la pipe sous linux, si la deuxième commande nécessite plus qu'un argument, par exemple, je veux utiliser la commande find qui va retourner des fichiers que je veux les utiliser comme premier argument de la commande cp qui nécessite un deuxième argument : la destination, comment donc je peux combiner toutes ces données. merci d'avance

4 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    find /chemin -type f -name "*.txt" -exec cp -v {} /destination/ \;

    0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Ou avec xargs
    ~$ ls txt/*.txt -1
    txt/1.txt
    txt/adresses.txt
    txt/D.txt
    txt/fich3.txt
    txt/fichier.txt
    txt/liste_de_mots_francais.txt
    txt/number.txt
    txt/sed.txt
    ~$ find /home/lami20j/txt/ -type f -name '*.txt' | xargs -I f cp -v f /mnt/sda7/txt2/
    « /home/lami20j/txt/fich3.txt » -> « /mnt/sda7/txt2/fich3.txt »
    « /home/lami20j/txt/1.txt » -> « /mnt/sda7/txt2/1.txt »
    « /home/lami20j/txt/liste_de_mots_francais.txt » -> « /mnt/sda7/txt2/liste_de_mots_francais.txt »
    « /home/lami20j/txt/number.txt » -> « /mnt/sda7/txt2/number.txt »
    « /home/lami20j/txt/adresses.txt » -> « /mnt/sda7/txt2/adresses.txt »
    « /home/lami20j/txt/fichier.txt » -> « /mnt/sda7/txt2/fichier.txt »
    « /home/lami20j/txt/sed.txt » -> « /mnt/sda7/txt2/sed.txt »
    « /home/lami20j/txt/D.txt » -> « /mnt/sda7/txt2/D.txt »
    ~$ ls /mnt/sda7/txt2 -1
    1.txt
    adresses.txt
    D.txt
    fich3.txt
    fichier.txt
    liste_de_mots_francais.txt
    number.txt
    sed.txt

    0
  3. ilo
     
    D'abord je te remerci.
    bon j'ai compris votre méthode, mais ma question est général à propos des commandes à plusieurs arguments ^^
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Re,

      mais ma question est général à propos des commandes à plusieurs arguments ^^
      Le nombre d'arguments d'une commande dépends de la manière dont la commande (le programme) a été conçue.

      Généralement une commande à la syntaxe suivante

      commande options arguments
      Ensuite le caractère facultatif et/ou obligatoire des options et/ou arguments et différent pour chaque commande.
      Les options peuvent être coutres o longues.
      Les arguments peuvent être : un seul argument ou plusieurs

      Pour le général tu as maintenant la réponse.

      Je pense que tu as plutôt besoin à propos de ton problème ce qui est plutôt concret ;-)
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Re-

      Qu'entends-tu exactement par "arguments" ?
      Si tu sous-entends par là "fichier d'entrée" et "fichier de sortie", avec les 2 solutions données ci-dessus ils sont représentés par "{}" (pour mon exemple) et par "f" pour l'exemple de lami20j et peuvent être utilisés par bon nombre de commandes.

      $ ls -1                                                
      fich1.txt                                                               
      fich2.txt                                                               
      fich3.txt                                                               
      le_fich.txt                                                             
      mon fich.txt                                                            
      ton fich.txt     
                                                             
      $ find . -type f -name "*" | xargs -i -t cp -v {} {}.bak
      cp -v ./le_fich.txt ./le_fich.txt.bak
      './le_fich.txt' -> './le_fich.txt.bak'
      cp -v ./ton fich.txt ./ton fich.txt.bak
      './ton fich.txt' -> './ton fich.txt.bak'
      cp -v ./fich3.txt ./fich3.txt.bak
      './fich3.txt' -> './fich3.txt.bak'
      cp -v ./fich2.txt ./fich2.txt.bak
      './fich2.txt' -> './fich2.txt.bak'
      cp -v ./fich1.txt ./fich1.txt.bak
      './fich1.txt' -> './fich1.txt.bak'
      cp -v ./mon fich.txt ./mon fich.txt.bak
      './mon fich.txt' -> './mon fich.txt.bak'
      
      $ ls -1
      fich1.txt
      fich1.txt.bak
      fich2.txt
      fich2.txt.bak
      fich3.txt
      fich3.txt.bak
      le_fich.txt
      le_fich.txt.bak
      mon fich.txt
      mon fich.txt.bak
      ton fich.txt
      ton fich.txt.bak
      
      $


      cp -v {} {}.bak
      Le premier "{}" représente le fichier d'entrée et le second "{}.bak" représente le fichier de sortie qui en fait est le même que le fichier d'entrée mais auquel on a rajouté l'extension ".bak".
      0
    3. Utilisateur anonyme
       
      Donc si je comprend bien ton exemple, on pourrait faire ceci pour un backup par exemple, on pourrait faire :
      $ find . -type f -name "*" | xargs -i -t cp -v {} /mnt/backup/{}.bak


      @++ :- )
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Exactement, voir aussi directement sans passer par "xargs" :

      find . -type f -name "*" -exec cp -v {} /mnt/backup/{}.bak \;
      0