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 :

Boucle for file in <quelquechose de vide>


Sujet :

Shell et commandes GNU

  1. #1
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut Boucle for file in <quelquechose de vide>
    Bonjour,

    J'ai un script shell qui doit faire quelque chose pour chaque fichier xls contenu dans un dossier.

    J'ai donc le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for file in $DATADIRECTORY/*.xls 
            do
                    echo $file;
                   <fait quelque chose>
            done;
    Sauf que si il n'y a pas de fichier xls dans mon dossier il passe quand même dans le do avec la valeur <DATADIRECTORY>/*.xls.
    Autant dire que ce que j'appel dans le do n'apprécie pas trop.

    Quel est la meilleure solution pour éviter ce petit problème ?
    (note : je suis quasi débutante en shell)

    Merci d'avance !!
    Informaticienne le jour, créatrice de bijoux la nuit (https://www.facebook.com/La-Fée-Chro...07539656306271) et maman à plein temps !

  2. #2
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Pour répondre exactement à ta question, le mieux est de passer par la commande ls :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for file in $(ls -1 $DATADIRECTORY/*.xls)
    do
      echo $file;
      <fait quelque chose>
    done
    Par contre, si le traitement à faire n'est pas trop complexe, tu peux aussi faire ça directement dans une commande find :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find $DATADIRECTORY -maxdepth 1 -type f -iname "*.xls" -exec <ta_commande> {} \;
    les accolades ({}) sont un token spécifique à la commande find et symbolisant le nom du fichier trouvé.

    Du coup, pour chaque fichier trouvé, tu fais le traitement.

  3. #3
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut
    La version ls me parle bien et me convient.

    Merci

    Edit : bah en fait non ça ne marche pas si fichier : ok sinon erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls: impossible d'accéder Ã* /opt/ImportOC/data/*.xls: Aucun fichier ou dossier de ce type
    Informaticienne le jour, créatrice de bijoux la nuit (https://www.facebook.com/La-Fée-Chro...07539656306271) et maman à plein temps !

  4. #4
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for file in $DATADIRECTORY/*.xls
    do
      if [ -s "${file}" ]; then
        echo $file;
        <fait quelque chose>
      fi
    done
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    find ${DATADIRECTORY} -maxdepth 1 -type f -name '*.xls' -print | while read
    do
      filename="${REPLY}"
      <fait quelque chose>
    done
    Comme ça on ne rentre dans la boucle que s'il y a bien au moins un fichier.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Lady Voir le message
    La version ls me parle bien et me convient.
    Attention! ça peut poser des problèmes s'il y a des fichiers avec des noms "bizarres" (avec des espaces, returns ou tabulations dans leur nom (comme c'est le cas sous certains os (Program\ Files, Documents\ and \ Settings, etc.))).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls: impossible d'accéder Ã* /opt/ImportOC/data/*.xls: Aucun fichier ou dossier de ce type
    C'est pas grave, c'est juste un message "normal" de ls sur la stderr que tu peux ignorer superbement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for file in $(ls ${DATADIRECTORY}/*.xls 2> /dev/null) ; do
       echo "${file}"
       # fait quelque chose avec ${file}
    done
    àmha, l'option '-1' de 'ls' est inutile car c'est le défaut lorsque la sortie n'est pas le tty.

  7. #7
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Je veux bien comprendre pourquoi j'ai été moinsé là (et Lady aussi par la même occasion).

    J'ai dit une grosse connerie ou quelqu'un avait juste besoin de passer ses nerfs ?

  8. #8
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut
    Citation Envoyé par Loceka Voir le message
    Je veux bien comprendre pourquoi j'ai été moinsé là (et Lady aussi par la même occasion).

    J'ai dit une grosse connerie ou quelqu'un avait juste besoin de passer ses nerfs ?
    Quelqu'un qui ne support pas qu'on soit débutant ou qu'on se trompe je suppose ...

    Enfin bref merci à tous j’hésite entre la version avec while qui n'entre pas dans le do ce qui me semble plus logique et celle avec test sur l’existence du fichier


    Edit : c'est finalement la version de zipe31 qui va me servir !! Merci à tous.
    Informaticienne le jour, créatrice de bijoux la nuit (https://www.facebook.com/La-Fée-Chro...07539656306271) et maman à plein temps !

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    je le dit encore une fois : ON N'UTILISE PAS ls DANS UN SCRIPT !!!
    et je moinsse systèmatiqement ceux qui suggèrent une telle solution.

    en bash, il existe une option nullglob:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    shopt -s nullglob
    for f in fichier\ qui\ n\'existe\ pas; do echo "$f";done
    en shell strictement POSIX, le mieux est sans doute d'utiliser find.
    ou alors de faire un test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in fichier\ qui\ n\'existe\ pas; do test -f "$f" && echo "actions sur \"$f\"" || echo ":( \"$f\" n'existe pas"'!'; done
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 15/10/2009, 12h13
  2. Réponses: 3
    Dernier message: 06/07/2004, 10h21
  3. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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