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 :

Rechercher dans un fichier et copier la liste des fichiers


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut Rechercher dans un fichier et copier la liste des fichiers
    bonjour
    j'ai un fichier en 1.csv avec séparateur ; et contenant çà:
    ext1.jpg a.jpg
    ext2.jpg a.jpg
    ext3.jpg a.jpg
    ext4.jpg b.jpg
    ext5.jpg b.jpg
    ext6.jpg c.jpg
    j'aimerais :
    si sur la colonne 2 le fichier a.jpg existe dans le répertoire ça copie a.jpg en ext1.jpg ext2.jpg ext3.jpg
    la même chose pour b.jpg ça copie en ext4.jpg ext5.jpg
    ect..
    je pensais utiliser awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F";" '{print $1 $2}'
    mais je ne sais comment faire après
    merci pour votre aide

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 44
    Points : 146
    Points
    146
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while IFS=';' read -a fichiers
    do
      [ -f "${fichiers[1]}" ] && cp "${fichiers[1]}"  "${fichiers[0]}"
    done < fichier

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    ca ne marche pas j'ai cette erreur
    : syntax error: bad substitution

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 44
    Points : 146
    Points
    146
    Par défaut
    Quel shell utilises-tu ?
    Peux-tu montrer ton script ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    j'ai essayé plutot ce fichier refint.sh car je comprends mieux le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!/bin/sh
    rep_txt=/volume1/test/
    fich=1b.csv
    while read line
    do
    f_s=`echo $line | awk -F";" '{ print $1 }'`
    f_d=`echo $line | awk -F";" '{ print $0 }'`
    if (-e $f_s)
    then {cp $rep_txt$f_s $rep_txt$f_d".jpg"}
    fi
    done < $rep_txt$fich
    mais ca me génère cette erreur
    /volume1/test/refint.sh: line 17: -e: not found

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 44
    Points : 146
    Points
    146
    Par défaut
    1. Ne dis pas que ça ne marche pas si tu changes le code
    2. donne plus d'informations

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/sh
    rep_txt=/volume1/test/
    fich=1b.csv
    while IFS=';' read f_d f_s
    do
    [ -e "${rep_txt}${f_s}" ] && cp "${rep_txt}${f_s}" "${rep_txt}${f_d}.jpg"
    done < "${rep_txt}${fich}"

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    merci chardclo.j'ai lancé ton script .il n'y a pas d'erreur mais ca ne copie pas mon fichier a.jpg qui est dans le repertoire /volume1/test/ .
    c'est pas un probleme d'interprétation du point entre a et jpg non?

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 44
    Points : 146
    Points
    146
    Par défaut
    Je viens de tester..pas de soucis de mon côté...

    par contre, j'ai recopié et modifié bêtement cp $rep_txt$f_s $rep_txt$f_d".jpg" où tu rajoutes l'extension .jpg
    de ce fait, les fichiers copiés ont une 2nde extension inutile.
    --> à supprimer du script

    edit : peux-tu poster les traces obtenues ainsi :
    sh -x nomscript

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bigs3232 Voir le message
    j'ai essayé plutot ce fichier refint.sh car je comprends mieux le code
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/sh
    rep_txt=/volume1/test/
    fich=1b.csv
    while read line
    do
    f_s=`echo $line | awk -F";" '{ print $1 }'`
    f_d=`echo $line | awk -F";" '{ print $0 }'`
    if (-e $f_s)
    then {cp $rep_txt$f_s $rep_txt$f_d".jpg"}
    fi
    done < $rep_txt$fich
    mais ca me génère cette erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /volume1/test/refint.sh: line 17: -e: not found
    Salut

    Tu ne sais donc pas qu'un "test -e fic" peut s'écrire aussi [ -e fic ] mais certainement pas (-e fic ) ??? Et je ne vois pas ce que viennent faire ces accolades !!!

    Accessoirement, si le fichier se trouve dans le dossier "rep_txt", alors il faut l'inclure dans le test...

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/sh
    rep_txt=/volume1/test
    fich=1b.csv
    while read line
    do
        f_d=`echo "$line" | cut -f1 -d\;`
        f_s=`echo "$line" | cut -f2 -d\;`
     
        [ -e "$rep_txt/$f_s" ] && cp "$rep_txt/$f_s" "$rep_txt/$f_d"
    done < "$rep_txt/$fich"
    Ce qui, à peu de choses près, est exactement le même code que celui de chardclo.

    Accessoirement, je préconiserais plutôt le test -f car pour copier un fichier, faut non seulement qu'il existe mais qu'en plus ce soit un fichier régulier (ce que ne dit pas "test -e")...

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    voici que ce ca donne avec sh -x refint2.sh
    syno> sh -x /volume1/test/refint2.sh
    + rep_txt=/volume1/test/
    + fich=1b.csv
    + IFS=; read f_d f_s
     ][ -e /volume1/test/a.jpg
    + IFS=; read f_d f_s
     ][ -e /volume1/test/a.jpg
    + IFS=; read f_d f_s
     ][ -e /volume1/test/a.jpg
    + IFS=; read f_d f_s
     ][ -e /volume1/test/b.jpg
    + IFS=; read f_d f_s
     ][ -e /volume1/test/b.jpg
    + IFS=; read f_d f_s
     ][ -e /volume1/test/c.jpg
    + IFS=; read f_d f_s
    
    mon code est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #!/bin/sh
    rep_txt=/volume1/test/
    fich=1b.csv
    while IFS=';' read f_d f_s
    do
    [ -e "${rep_txt}${f_s}" ] && cp "${rep_txt}${f_s}" "${rep_txt}${f_d}"
    done < "${rep_txt}${fich}"
    sinon mon shell est BusyBox v1.16.1

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 44
    Points : 146
    Points
    146
    Par défaut
    peut on avoir le contenu de ton fichier csv ainsi que le résultat de printf '-%s-\n' /volume1/test/*.jpg

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    le resultat de printf '-%s-\n' /volume1/test/*.jpg
    est
    -/volume1/test/4p12v2a.jpg-
    -/volume1/test/6p12v5v2a34-12_c.jpg-
    -/volume1/test/a.jpg-
    -/volume1/test/b.jpg-
    -/volume1/test/wifi.jpg-
    j'ai copié en image le fichier 1b.csv
    Images attachées Images attachées  

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    a mon avis faut mettre quelque chose devant cp
    du genre /bin/cp

  14. #14
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 44
    Points : 146
    Points
    146
    Par défaut
    Citation Envoyé par bigs3232
    j'ai copié en image le fichier 1b.csv
    justement non, il faudrait le contenu de ce fichier et non la version "xls"
    -->cat -e /volume1/test/b1.csv
    Citation Envoyé par bigs3232
    a mon avis faut mettre quelque chose devant cp
    du genre /bin/cp
    absolument pas...
    d'après les traces, on voit bien qu'il ne tente même pas de copier car il ne trouve pas les fichiers dans /volume1/test
    ce qui veut dire qu'il y a :
    - soit un souci dans ton fichier (c'est pourquoi il faudrait le contenu du fichier tel que je te le demande)
    - soit un souci dans les noms de fichiers sur ton disque (mais à priori, ça ne semble pas être le cas si l'on se fie aux 2ndes traces fournies)

    +1 pour le -a et non le -e (comme j'avais mis dans ma 1ère réponse)

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    le fichier a l'air bon .J'ai fais plusieurs test avec echo ${rep_txt}${f_s} ca affiche bien correctement .
    sinon le resultat de cat /volume1/test/1b.csv
    est
    syno> cat /volume1/test/1b.csv
    ext1.jpg;a.jpg
    ext2.jpg;a.jpg
    ext3.jpg;a.jpg
    ext4.jpg;b.jpg
    ext5.jpg;b.jpg
    ext6.jpg;c.jpg
    je me prends la tête avec çà depuis ce matin à 6h.franchement c'est quand meme bizarre.
    cat -e n'est pas reconnu sur mon serveur

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    j'ai utilisé ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/bin/sh
    rep_txt=/volume1/test
    fich=1b.csv
    while read line
    do
        f_d=`echo "$line" | cut -f1 -d\;`
        f_s=`echo "$line" | cut -f2 -d\;`
        [ -e "$rep_txt/$f_s" ] && cp "$rep_txt/$f_s" "$rep_txt/$f_d"
    done < "$rep_txt/$fich"
    ça donne
    + rep_txt=/volume1/test
    + fich=1b.csv
    + read line
    + echo ext1.jpg;a.jpg
    + cut -f1 -d;
    + f_d=ext1.jpg
    + echo ext1.jpg;a.jpg
    + cut -f2 -d;
    + f_s=a.jpg
     ][ -e /volume1/test/a.jpg
    + read line
    + cut -f1 -d;
    + echo ext2.jpg;a.jpg
    + f_d=ext2.jpg
    + echo ext2.jpg;a.jpg
    + cut -f2 -d;
    + f_s=a.jpg
     ][ -e /volume1/test/a.jpg
    + read line
    + echo ext3.jpg;a.jpg
    + cut -f1 -d;
    + f_d=ext3.jpg
    + cut -f2 -d;
    + echo ext3.jpg;a.jpg
    + f_s=a.jpg
     ][ -e /volume1/test/a.jpg
    + read line
    + echo ext4.jpg;b.jpg
    + cut -f1 -d;
    + f_d=ext4.jpg
    + echo ext4.jpg;b.jpg
    + cut -f2 -d;
    + f_s=b.jpg
     ][ -e /volume1/test/b.jpg
    + read line
    + echo ext5.jpg;b.jpg
    + cut -f1 -d;
    + f_d=ext5.jpg
    + echo ext5.jpg;b.jpg
    + cut -f2 -d;
    + f_s=b.jpg
     ][ -e /volume1/test/b.jpg
    + read line
    + cut -f1 -d;
    + echo ext6.jpg;c.jpg
    + f_d=ext6.jpg
    + echo ext6.jpg;c.jpg
    + cut -f2 -d;
    + f_s=c.jpg
     ][ -e /volume1/test/c.jpg
    + read line
    
    en fait à mon avis c'est vraiment cp qui déconne

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bigs3232 Voir le message
    je me prends la tête avec çà depuis ce matin à 6h.franchement c'est quand meme bizarre.
    J'ai un soupçon sur la cause du pb. Enlève le set -x (qui donne trop d'infos) et rajoute qqpart la ligne
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "[$f_d] [$f_s]"

    Je pense en effet que ton fichier csv (créé sous zindow) contient un saut de ligne sous forme "\r\n" ce qui n'est pas la forme attendue sous Unix. Et donc que l'une des deux variable ne contient pas "a.jpg" mais "a.jpg\r".

    Donc le echo va afficher le contenu de la variable entre crochets (je fais afficher les deux pour simplifier). Si la variable est bien formatée, le crochet apparaitra sur la ligne. Si elle contient un caractère "\r" de trop, le crochet apparaitra dans la ligne du dessous (ce qui apparait d'ailleurs dans l'affichage donné par "set -x").

    Si c'est ça, alors te faut convertir ton csv en fichier Unix via l'utilitaire dos2unix...

    Citation Envoyé par bigs3232 Voir le message
    en fait a mon avis c'est vraiment cp qui déconne
    Sûrement pas. Comme on te l'a dit, si cp déconnait tu verrais quand-même le shell tenter de le lancer. De plus, accuser une commande éprouvée est la dernière des choses à faire...

    Citation Envoyé par bigs3232 Voir le message
    ca donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    + rep_txt=/volume1/test
    + fich=1b.csv
    + read line
    + echo ext1.jpg;a.jpg
    + cut -f1 -d;
    + f_d=ext1.jpg
    + echo ext1.jpg;a.jpg
    + cut -f2 -d;
    + f_s=a.jpg
    ][ -e /volume1/test/a.jpg
    Tu remarques que le ] sensé être après le "[ -e" est situé en début de ligne ? Normalement ça devrait donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    + rep_txt=/volume1/test
    + fich=1b.csv
    + read line
    + echo ext1.jpg;a.jpg
    + cut -f1 -d;
    + f_d=ext1.jpg
    + echo ext1.jpg;a.jpg
    + cut -f2 -d;
    + f_s=a.jpg
    [ -e /volume1/test/a.jpg ]
    Pour moi, c'est ce "\r" présent dans la variable "f_s" qui en est la cause...

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    ah oui j'ai l'impression.voici ce que ca donne si je rajoute echo "[$f_d] [$f_s]"
    ]ext1.jpg] [a.jpg
    ]ext2.jpg] [a.jpg
    ]ext3.jpg] [a.jpg
    ]ext4.jpg] [b.jpg
    ]ext5.jpg] [b.jpg
    ]ext6.jpg] [c.jpg
    .du coup comment modifier le code .en ajoutant çà ?
    fich=1b.csv
    dos2unix $fich $fich

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Points : 118
    Points
    118
    Par défaut
    comme la commande dos2unix ne marche pas chez moi j'ai ajouté
    perl -pi -e "s/\r\n/\n/g" $fichvoici le bon code qui marche et merci à tous les 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/sh
    rep_txt=/volume1/test
    fich=1b.csv
    #dos2unix $fich $fich
    perl -pi -e "s/\r\n/\n/g" $fich
    while read line
    do
        f_d=`echo "$line" | cut -f1 -d\;`
        f_s=`echo "$line" | cut -f2 -d\;`
        echo "[$f_d] [$f_s]"
        [ -e "$rep_txt/$f_s" ] && cp "$rep_txt/$f_s" "$rep_txt/$f_d"
    done < "$rep_txt/$fich"

  20. #20
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bigs3232 Voir le message
    ah oui j'ai l'impression.voici ce que ca donne si je rajoute echo "[$f_d] [$f_s]"

    .du coup comment modifier le code .en ajoutant çà ?
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    dos2unix $fich $fich
    Surtout pas !!! Déjà la commande ne se lance qu'une fois car elle modifie le fichier donc faut que tu le fasses en dehors du script. Et en plus son usage n'est pas de taper "dos2unix source dest" mais simplement "dos2unix fichier_a_convertir"


    Citation Envoyé par bigs3232 Voir le message
    comme la commande dos2unix ne marche pas chez moi
    Si t'es sur un Linux type Debian faut rajouter le package "dosutils"

    Citation Envoyé par bigs3232 Voir le message
    perl -pi -e "s/\r\n/\n/g" $fich
    Ok, le perl le fait aussi. Et comme tu as mis une syntaxe sed, je pense que sed aussi aurait pu le faire. Toutefois ce n'est pas la peine de le mettre dans le script !!! Soit tu le converti une fois en dehors du script et ensuite tu l'utilises normalement, soit tu le convertis à la volée dans le script en redirigeant "la volée" dans un pipe de traitement style
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/sh
    rep_txt=/volume1/test
    fich=1b.csv
     
    sed -e "s/\r\n/\n/g" "$rep_txt/$fich" | while read line
    do
        f_d=`echo "$line" | cut -f1 -d\;`
        f_s=`echo "$line" | cut -f2 -d\;`
        [ -e "$rep_txt/$f_s" ] && cp "$rep_txt/$f_s" "$rep_txt/$f_d"
    done

    Citation Envoyé par bigs3232 Voir le message
    Merci à tous les 2
    A+

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/02/2009, 17h58
  2. Réponses: 9
    Dernier message: 21/08/2007, 08h22
  3. Réponses: 4
    Dernier message: 11/07/2007, 19h28
  4. Réponses: 4
    Dernier message: 04/01/2007, 19h30
  5. Réponses: 9
    Dernier message: 27/10/2005, 22h38

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