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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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 !!

  2. #2
    Membre Expert
    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
    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
    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

  4. #4
    Expert confirmé

    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
    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

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    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 102
    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 102
    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
    Membre Expert
    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
    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
    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.

+ 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