IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Tri dans un dossier d'archives (script shell?)


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut Tri dans un dossier d'archives (script shell?)
    Bonjour à tous,

    Alors voila, j'ai un dossier contenant des archives. Elle sont toutes nommées comme ceci : xxxx-0001, xxxx-0002, .. Le nombre en gras détermine l’ancienneté de l'archive (l'archive se terminant par "0003" est plus ancienne que celle qui se termine par "0005" mais plus récente que celle qui se termine par "0002" etc..) Dans chacune des archives, il y a un fichier XML. Or le fichier XML peut être le même dans plusieurs archives (le même = même nom de fichier).
    Ce que je souhaite c'est ne garder que l'archive la plus recente par fichier XML unique.

    Par exemple si l'archive xxxx-0003 et xxxx-0034 contiennent le même fichier XML, l'archive xxxx-0003 soit supprimée.

    Je voulais savoir quelle étaient les solutions possibles et vu qu'on m'a parle de script SHELL, la difficulté de ce dernier.

    Merci d'avance à tous ceux qui m'apporteront leur aide.

    EDIT : Merci disedorgue. Oui en effet en relisant, j'ai dit l'inverse de ce que je voulais Modifié !

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Bonjour,
    Citation Envoyé par DarKaa Voir le message
    Bonjour à tous,

    Alors voila, j'ai un dossier contenant des archives. Elle sont toutes nommées comme ceci : xxxx-0001, xxxx-0002, .. Le nombre en gras détermine l’ancienneté de l'archive (l'archive se terminant par "0003" est plus ancienne que celle qui se termine par "0005" mais plus récente que celle qui se termine par "0002" etc..) Dans chacune des archives, il y a un fichier XML. Or le fichier XML peut être le même dans plusieurs archives (le même = même nom de fichier).
    Ce que je souhaite c'est ne garder que l'archive la plus ancienne par fichier XML unique.

    Par exemple si l'archive xxxx-0003 et xxxx-0034 contiennent le même fichier XML, l'archive xxxx-0003 soit supprimée.

    Je voulais savoir quelle étaient les solutions possibles et vu qu'on m'a parle de script SHELL, la difficulté de ce dernier.

    Merci d'avance à tous ceux qui m'apporteront leur aide.
    En rouge, ce qui semble incohérent.
    Cordialement.

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Bonjour,

    c'est quoi une archive ? tar ? zip ? tar.gz ?

    Un exemple de ce qui est possible:

    Des archives:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ find  /tmp/ -iname "testarchive*" | sort
    /tmp/testarchive001.tar.gz
    /tmp/testarchive002.tar.gz
    /tmp/testarchive003.tar.gz
    /tmp/testarchive004.tar.gz
    Les archives et le fichier ciblé (ici un txt mais ça peut être un xml):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ find  /tmp/ -iname "testarchive*" | sort| xargs -ITT bash -c 'echo -ne TT"\t";tar -ztf TT'
    /tmp/testarchive001.tar.gz      titi.txt
    /tmp/testarchive002.tar.gz      titi.txt
    /tmp/testarchive003.tar.gz      toto.txt
    /tmp/testarchive004.tar.gz      titi.txt
    On sépare les champs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ find  /tmp/ -iname "testarchive*" | sort| xargs -ITT bash -c 'echo -ne TT"\t";tar -ztf TT'|sed 's/.*testarchive/&\t/;s/.tar.gz.*/\t&/'
    /tmp/testarchive        001     .tar.gz titi.txt
    /tmp/testarchive        002     .tar.gz titi.txt
    /tmp/testarchive        003     .tar.gz toto.txt
    /tmp/testarchive        004     .tar.gz titi.txt
    La liste des archives à garder:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ find  /tmp/ -iname "testarchive*" | sort| xargs -ITT bash -c 'echo -ne TT"\t";tar -ztf TT'|sed 's/.*testarchive/&\t/;s/.tar.gz.*/\t&/'|awk '{mem[$4]=$2} END{for (fic in mem) print "/tmp/testarchive"mem[fic]".tar.gz";}'
    /tmp/testarchive003.tar.gz
    /tmp/testarchive004.tar.gz
    Il ne reste plus qu'à soustraire ces adresses de la liste des fichiers supprimables (grep -v -f) et de supprimer (rm -i ou rm -f).
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    Bonjour et merci de ta réponse.

    Alors d'abord oui ce sont des archives .zip

    Ensuite j'avoue être un débutant (et encore c'est beaucoup dire) pour ce qui est script shell

    Moi j’étais un peu parti vers quelque chose comme ça (j'avance pas par pas ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    #!/bin/zsh
     
    getFiles() {
       Rep="$1"
       for item in $Rep/* //parcourir les archives
       do 
       [ -f "$item" ] && file=$(echo "$item") #je stocke le nom du fichier dans une variable
       unzip $file #je dezip l'archive (et faudrait que je stocke le fichier XML qu'il y a dedans)
       #pseudo code car j'en suis la :
       #reparcourir les archives en partant de la ou je suis dans le répertoire
       #en deziper une et comparer les nom des fichiers XML
       #si les noms sont identiques, je supprime la première archive et les fichiers XML qui ont été extraits et je continue
       done
    }
     
    [ -d "${1:-.}" ] && getFiles ${1:-.}
    Quand je vois qu'en une ligne tu arrives deja a faire les comparaisons etc.. Je me dis que je passe a cote de quelque chose mais j'avoue ne pas trop comprendre ce que tu as fait.

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Déjà, le $, c'est l'invite de commande ... il ne faut pas la reprendre.

    Après j'utilise une conduite, une suite de commandes séparés par un pipe |, qui donne à la commande suivante le résultat de son travail sur ce que lui a donné la commande précédente
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ commande1 | commande2 | commande3
    Du coup, au lieu de faire une boucle sur les fichiers comme tu le fais, je travaille directement avec "un fichier" qui contient la liste de mes cibles, récupérées par un find. Les deux sont bien, c'est une question de préférence.

    Je m'assure que les plus récents seront les plus bas dans la liste en la triant avec sort.

    Puis je traite les cibles une à une avec xargs en demandant d'afficher (echo) le nom et le contenu (tar -t).

    Ensuite, je sépare le numéro avec sed pour le traiter dans awk. Certains vont hurler car awk peut le faire. Question de préférence, encore.

    Enfin, la commande awk permet de transformer un fichier texte en considérant ses "champs". C'est la 2ème et la 4ème colonne qui nous intéressent. On ne garde que le plus récent numéro pour un nom de fichier contenu dans l'archive.

    Avec grep, on filtre la liste des archives avec la liste qu'on vient d'obtenir.

    Et avec rm, on supprime tout ça.

    Est-ce plus clair? Y a pas mal à étudier.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    Merci encore.

    Oui ça va (un peu) mieux quand c'est découpé car je connais ces commandes c'est juste que c’était en première année et que les arguments et les paramètres sont un peu tordu

    Bon alors j'ai cree trois archives :
    - AKO_01.zip (contenant le fichier "1.xml")
    - AKO_02.zip (contenant le fichier "2.xml")
    - AKO_03.zip (contenant le fichier "1.xml")

    Et j'aimerai après exécution du script qu'il me reste AKO_02.zip et AKO_03.zip (suivant la règle de gestion décrite)

    et j'ai tente d'utiliser la commande que tu m'as donne mais je trébuche très vite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find . -iname "AKO_*" | sort| xargs -ITT bash -c 'echo -ne TT"\t";unzip TT'|sed 's/.*AKO_/&\t/;s/.zip.*/\t&/'|awk '{mem[$4]=$2} END{for (fic in mem) print "./AKO_"mem[fic]".zip";}'
    La sortie n'est pas terrible..

    Puis comme en fait c'est les XML qui m’intéresse (donc n'avoir après l’exécution du script) que les fichiers "2.xml" et "1.xml" (mais de l'archive AKO_03.zip)
    Ne serait pas plus simple de boucler sur les archives rangées et faire un unzip -u (qui écraserait les xml portant le même nom) ?

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    1. Ah! Oui. Dans l'emportement, j'ai oublié de tapé ceci: pour obtenir la liste des fichiers avec unzip, c'est l'option -l.
    2. Pour avoir les xml, filtre avec grep.

      J'ai ajouter un fichier tata.pdf à l'archive numéro 2. Je filtre de la manière suivante:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      $ find  /tmp/ -iname "testarchive*" | sort| xargs -ITT bash -c 'echo -ne TT"\t";tar -ztf TT|grep txt'|sed 's/.*testarchive/&\t/;s/.tar.gz.*/\t&/'|awk '{mem[$4]=$2} END{for (fic in mem) print "/tmp/testarchive"mem[fic]".tar.gz";}'
      /tmp/testarchive003.tar.gz
      /tmp/testarchive004.tar.gz
      A toi de remplacer txt par xml.
    3. Ne serait pas plus simple de boucler sur les archives rangées et faire un unzip -u (qui écraserait les xml portant le même nom) ?
      Mais tu veux quoi ? Au début, tu voulais supprimer des archives et maintenant tu veux récupérer un xml...
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    Bon j'avoue je ne suis pas très clair

    Bah pour avoir tous les XML uniques les plus récents (en fonction de leur archive parente), j'ai utilisé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #!/bin/zsh
     
    getFiles() {
    	Rep="$1"
    	sort $Rep/
    	for item in $Rep/*
    	do 
    	[ -f "$item" ] && file=$(echo "$item")
    	if [ ${file##*.} = 'zip' ]
    	then
    		unzip -uo $file
    	fi
          #[ -d "$item" ] && getFiles "$item"
       done
    }
     
    [ -d "${1:-.}" ] && getFiles ${1:-.}
    Et ça a l'air de bien marcher

    Maintenant je suis curieux et j'ai envie de comprendre la ligne de code que tu m'as donnée et faire la même chose (Enfin si je peux après cette commande n'avoir que les archives les plus récentes par fichier XML unique, j'imagine qu’après il me reste a boucler sur toute les archives et unzip ). Mais la je bloque !

    J'ai pas beaucoup touche a la commande mais je piétine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find . -iname "AKO_*" | sort| xargs -ITT bash -c 'echo -ne TT"\t";unzip -l TT|grep xml'|sed 's/.*AKO_/&\t/;s/.zip.*/\t&/'|awk '{mem[$4]=$2} END{for (fic in mem) print "AKO_"mem[fic]".zip";}'
    J'aimerai arriver a faire marcher cette commande mais de toute façon j'ai le résultat voulu avec la première solution. C'est juste que la deuxième solution est beaucoup plus puissante car elle unzip rien et supprime direct les archives

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    • J'aimerai arriver a faire marcher cette commande mais
      Ne marche-t-elle pas ? Quel message d'erreur ? Quel étage de la commande ne donne pas le bon résultat intermédiaire ?
    • Tu sembles utiliser zsh. Pourquoi zsh ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/zsh
     
    find . -iname "AKO_*" | sort| xargs -ITT bash -c 'echo -ne TT"\t";unzip -l TT|grep xml'|sed 's/.*AKO_/&\t/;s/.zip.*/\t&/'|awk '{mem[$4]=$2} END{for (fic in mem) print "AKO_"mem[fic]".zip";}'
    Sortie:
    AKO_3.zip
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/zsh
     
    find . -iname "AKO_*" | sort
    Sortie:
    ./AKO_1.zip
    ./AKO_2.zip
    ./AKO_3.zip
    Si je teste le reste de la commande ca bloque
    J'utilise Babun qui est un shell sous Windows qui ne n'oblige pas son utilisateur d'avoir les droits administrateurs car je désirais juste faire ce script (et non merci les cmd windows )

  11. #11
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Que donne unzip -l AKO_3.zip ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  12. #12
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    Sortie :
    Archive: AKO_3.zip
    Length Date Time Name
    --------- ---------- ----- ----
    9 02-09-2015 16:57 1.xml
    --------- -------
    9 1 file

  13. #13
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Effectivement, le filtrage pour récupérer le nom du xml est plus important que simplement avoir la ligne.
    Tes xml n'ont pas d'espace dans le nom de fichier ?
    Si c'est le cas, tu peux remplacer grep xml par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/xml/{s/.* \(.*\.xml\)/\1/p}'
    Je voudrais la sortie juste après cet étage.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    Tu aimerais donc que je teste la commande suivante ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -iname "AKO_*" | sort| xargs -ITT bash -c 'echo -ne TT"\t";unzip -l TT|sed -n "/xml/{s/.* \(.*\.xml\)/\1/p}"'
    EDIT : Je pense que c'est le cas vu le résultat, je te poste la sortie :
    ./AKO_1.zip 1.xml
    ./AKO_2.zip 2.xml
    ./AKO_3.zip 1.xml

  15. #15
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Super résultat. Toute la ligne doit marcher, non?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  16. #16
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    En effet, ça a l'air de marcher car la sortie est :
    AKO_3.zip
    AKO_2.zip
    Donc si je veux avoir que ces deux archives il faudrait que je les redirige dans un répertoire ou bien supprimer celles inutiles (dans le cas, AKO_1.zip), quel est le plus facile?

    J'imagine que dans le premier cas, je dois rajouter un mv a la commande alors que dans l'autre cas il me faut le résultat inverse que je couple par un rm.

  17. #17
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    mv n'est pas une mauvaise idée. Tout dépend de ton but.
    Personnellement, je ferais ce que je proposais au début. Un grep et un rm.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blablabla | grep -v -f - <(find . -iname "AKO_*" )
    puis, quand tu es sûr:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blablabla | grep -v -f - <(find . -iname "AKO_*" ) | xargs rm -f
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  18. #18
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Points : 48
    Points
    48
    Par défaut
    Euuuh j'ai fait "man blablabla" et rien..
    Bon d'accord j’arrête d’être ***

    Pour bien comprendre, pour les paramètres du grep :
    -v : j'inverse le résultat de la sélection
    -f : je prend les fichiers
    - <(find . -iname "AKO_*) : qui commencent par AKO_

    Est ce a peu près ça?

    Et pour le xargs (j'avais jamais vu cette commande mais elle a l'air puissante) j'arrive pas a saisir pourquoi un "| rm -f" (ou mv) ne suffit pas

  19. #19
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Bonjour,

    Oui, il n'y a pas de manuel pour 'blablabla', et comme certain qui le mette dans leur signature, on peut faire un man man mais pas man woman...

    Bon, sérieusement, concernant xargs, il permet de passer des arguments à des commande qui en attendent:
    -le pipe est comme un fichier, la commande à sa gauche écrit dedans, la commande à sa droite lit dedans.
    -Tu as 2 type de commande standard sous unix/linux, celles qui attendent un fichier en paramètre, et celles qui attendent un argument.
    Et donc comme le pipe est un fichier, la commande à sa droite doit être du type de celle qui attendent un fichier.
    Pour les commandes qui attendent un argument que l'on veut utiliser avec un pipe, il y a la commande xargs.

    Hum... pas très clairs mes explications...
    Cordialement.

  20. #20
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Le pipe est un "évitement" de fichier temporaire. Au lieu d'avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ls >/tmp/montmp
    grep 'txt' /tmp/montmp
    rm -f /tmp/montmp
    on fait [Ce que tu sembles avoir loupé]
    • le tiret indique l'entrée (ou sortie) standard.
      Ici, on indique à grep que le fichier utilisé par l'option -f est l'entrée standard, donc ce qui sort du pipe.
    • <( ) est un substitution de processus. Le résultat est considéré comme un fichier.
      Ainsi on peut avoir une commande while .... do ... done < <( ... ) et l'espace entre les '<' n'est pas inutile du tout. C'est une redirection d'une substitution de processus considérée comme fichier.
    • Au final, on filtre notre liste de bon fichier d'une liste de tous les fichiers possibles.

    [/Ce que tu sembles avoir loupé]
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [bash]erreurs dans l'écriture d'un script shell
    Par homeostasie dans le forum Linux
    Réponses: 3
    Dernier message: 23/03/2009, 17h09
  2. Réponses: 2
    Dernier message: 07/11/2006, 11h34
  3. Programme en C dans un script shell
    Par am.adnane dans le forum Linux
    Réponses: 1
    Dernier message: 05/02/2006, 18h57
  4. Syntaxe dans un script shell
    Par cubepiege dans le forum Linux
    Réponses: 5
    Dernier message: 27/09/2005, 17h21
  5. Script shell - écriture dans un fichier
    Par Leishmaniose dans le forum Linux
    Réponses: 6
    Dernier message: 13/12/2004, 23h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo