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 :

Dupliquer un fichier à partir d'une liste de noms dans un fichier txt


Sujet :

Shell et commandes GNU

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut Dupliquer un fichier à partir d'une liste de noms dans un fichier txt
    j'ai un fichier 1.txt avec une liste de nom de fichier à dupliquer de cette forme
    et voici mon code de dupliquation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for line in $(cat 1.txt)
    do cp "xx.jpg" rep_dest/"$line"
    done
    ca me génère des fichiers avec des ** à la fin de de l'extention jpg comme ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    yy1.jpg**
    yy.jpg**
    je ne comprends pas pourquoi ces 2 étoiles sont là et comment enlever
    merci pour votre aide

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    commence par faire lire un fichier correctement au shell : Comment parcourir un fichier en shell.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    j'essaie d'utiliser la synthaxe sur le FAQ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while read -r line; do
    echo "$line"
    done < 1.txt
    mais j'ai cette erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /cygdrive/c/cygwin64/bin/p_dupli_img.sh: ligne 10: erreur de syntaxe près du symbole inattendu « done »
    /cygdrive/c/cygwin64/bin/p_dupli_img.sh: ligne 10: `done < 1.txt'

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    tu as écrit ton script sur W$. Il faut en convertir les fins de lignes au format UNIX.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    merci mais j'ai perdu beaucoup de temps à trouver cette solution.voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for line in $(cat 1.txt | tr -d '\r');do cp "xx.jpg" rep_dest/"$line";done

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    par contre quand je mets dans le fichier p_dupli_img.sh comme ceci, ca ne marche plus.
    je ne comprends rien du tout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #!/bin/bash
    for line in $(cat 1.txt | tr -d '\r')
    do cp "xx.jpg" rep_dest/"$line"
    done
    voici l'erreur généré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ligne 5: erreur de syntaxe : fin de fichier prématurée

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    pourquoi insistes-tu à utiliser la pire méthode pour "lire" un fichier ?

    et ton script est toujours au format DOS.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    c'est ma seule facon d'utiliser le cat avec tr pour supprimer les sauts lignes windows .avec la boucle while je ne peux pas utiliser le tr.et je ne comprends pas pourquoi c'est pas bien de faire de cette facon

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while read -r line
    do
       echo "$line"
    done < <(tr -d '\r' <./fichier)
    ou alors,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tr -d '\r' <./fichier > /tmp/fichier
    mv /tmp/fichier ./fichier
    while read -r line
    do
       echo "$line"
    done <./fichier
    il vaut mieux toujours chercher une solution qui n'utilise pas d'UUOC (Useless Use Of Cat).

    et avant que tu essaies de lister les fichiers d'un répertoire dans une boucle :
    ON N'UTILISE PAS ls DANS UN SCRIPT !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Par défaut
    Salut,
    avec un sed gnu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n 's/\r//;s/.*/cp "xx.jpg" &/e' 1.txt
    Cordialement.

  11. #11
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    merci à vous 2 mais je préfère ma méthode qui est plus simple et facile à comprendre

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    vivement qu'il y ait plus d'un mot par ligne pour te montrer à quel point tu te trompes !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    la methode de ctac_ marche parfaitement .toutefois le code mérite explication car là je ne comprends rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n 's/\r//;s/.*/cp "xx.jpg" &/e' 1.txt
    un sed s'utilise de cette facon zt là je comprends
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /mon/repertoire -name "*.php" -exec sed -i 's/MOT_RECHERCHER/MOT_DE_REMPLACEMENT/g' {} \;
    les 2 méthodes de N_BaH ne marchent pas malheureusement d'apres mes tests

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Par défaut
    Salut,
    Une petite explication.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/\r//;h;s/.*/cp "xx.jpg" &/e;x;s/.*/fichier & créé par la commande cp "xx.jpg" & et exécuter par la commande e de sed/' 1.txt
    Cordialement.

  15. #15
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    je comprends çà.c'est pour supprimer tr
    apres je ne comprends rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s/.*/cp "xx.jpg" &/e' 1.txt
    encore rien compris sur çà

  16. #16
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Par défaut
    Ok, on reprend
    sed va lire le fichier 1.txt ligne par ligne.
    Chaque ligne se termine par un \r et correspond au nom du fichier à créer.
    rien n'est affiché
    suppression du \r
    on ajoute au début de chaque ligne cp "xx.jpg"
    on obtient donc des lignes de la forme :
    qui correspond à une commande qui est exécuter par le e de sed.
    pour plus d'explications : info sed evaluate
    Cordialement.

  17. #17
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Sinon, en bash (pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while read -d $'\r' var
    do
      cp "xx.jpg" "rep_dest/$var"
    done <1.txt
    Après, faut que le fichier 1.txt soit cohérent: 1 fichier par ligne et que la ligne se termine par une fin de ligne à la windows, dernière ligne comprise...

  18. #18
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    tres belle explication ctac_ merci
    une peitte explication si vous avez le temps sur &/ avant e =>ca sert à quoi?
    merci à disedorgue .votre code marche aussi par contre je ne comprends pas çà

  19. #19
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    les 2 méthodes de N_BaH ne marchent pas malheureusement d'apres mes tests
    « ça marche pas » n'est pas une description de ce qui se passe/de ce qui ne se passe pas.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  20. #20
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    j'ai réussi à adapter votre méthode comme ceci pour que ca marche n_bah
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read -r line;do echo "$line";done < <(tr -d '\r' <1.txt)
    par contre votre 2eme methode je la trouve trop longue , il faut créer un fichier temporaire
    merci quand même

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/03/2017, 14h06
  2. [XL-2010] Macro pour renommer des fichiers à partir d'une liste de nom de fichiers
    Par thomahh dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/01/2013, 17h03
  3. Copie de fichier à partir d'une liste
    Par curt dans le forum VBA Access
    Réponses: 14
    Dernier message: 09/07/2008, 14h00
  4. [Conception] Téléchargement de fichier à partir d'une liste selectionnée
    Par charafax dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/04/2007, 13h53
  5. Sélectionner un fichier à partir d'une liste filtrée
    Par Lenaick dans le forum C++Builder
    Réponses: 7
    Dernier message: 14/03/2006, 11h16

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