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 sur fichiers et le caractère espace


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut Boucle sur fichiers et le caractère espace
    Bonjour,

    Je cherche à faire une action sur tous les fichiers du répertoire "monRep".

    Le seul problème et que le nom des fichiers de ce répertoire peuvent contenir un ou plusieurs caractères espace.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $ ls -1 monRep
    ...
    Copie de toto
    dummy
    pipo
    toto
    ...
    Par conséquent, quelque chose comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for fichier in $(ls monRep)
    do
        # faire une action, ici affichage
        echo $fichier
    done
    ne peut absolument pas convenir car un fichier nommé "Copie de toto" fournira à la boucle "for" les 3 entrées "Copie", "de" et "toto" !!!

    Comment faire ?

    Merci.

  2. #2
    Membre Expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut
    Il faut jouer sur le séparateur de champs/d'instructions IFS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    IFS=$'\n\t'
    for fichier in $(ls monRep)
    do
        # faire une action, ici affichage
        echo $fichier
    done
    unset IFS

  3. #3
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Maintenant ça marche bien pour ces fichiers "Copie de toto"

    Mais ça ne marche plus pour les autres

    En fait, ça me bouffe certains caracères !?

  4. #4
    Membre Expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut
    Citation Envoyé par domiq44
    Mais ça ne marche plus pour les autres

    En fait, ça me bouffe certains caracères !?
    Saurais-tu être plus précis ?
    Habituellement, cela ne pose aucun problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    IFS=$'\n\t'
    for fichier in $(ls -1)
      do 
        echo "[$fichier]"
    done
    unset IFS
    dans mon répertoire de test, me fournit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [img_1.jpg]
    [img 2.jpg]
    [img_3.jpg]
    [img 4.jpg]
    [img_5.jpg]
    Ce qui correspond parfaitement au contenu.

  5. #5
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Je pense que cela doit venir de mon système de m...e : AIX !!!

    Moi j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $ ls -1
    img 2.jpg
    img 4.jpg
    img_1.jpg
    img_3.jpg
    img_5.jpg
    test.sh
    $
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $ cat test.sh
    IFS=$'\n\t'
    for fichier in $(ls -1)
      do
        echo "[$fichier]"
    done
    unset IFS
    $
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $ test.sh
    [img 2.jpg
    img 4.jpg
    img_1.jpg
    img_3.jpg
    img_5.jpg
    ]
    [es]
    [.sh]
    $
    Je ne comprends pas !!!

  6. #6
    Membre Expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut
    Citation Envoyé par domiq44
    Je pense que cela doit venir de mon système de m...e : AIX !!!
    Mais c'est très bien, AIX ... parfois un peu délicat à l'emploi, mais très bien quand même (surtout les babasses qui le font tourner ).

    Effectivement, je vois le problème.
    Il vient de l'affectation dans IFS.
    AIX interprète le \t et le \n et met alors t et n dans la liste des séparateurs, virant du même coup l'espace (c'est ce qu'on veut), mais aussi la tabulation et le retour à la ligne.
    Du coup, tous les t et n sont considérés comme des séparateurs, donc bouffés.

    La syntaxe que j'ai utilisé (IFS=$'\t\n') est une syntaxe BASH.
    Il doit exister un équivalent sous AIX qui permette d'insérer ces deux caractères de contrôle dans la variable d'environnement.

    Bon courage.

  7. #7
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Malheureusement, je ne trouve pas !!!

    Est-ce que quelqu'un dans le forum connait la syntaxe ????????

  8. #8
    DIE
    DIE est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 101
    Par défaut
    salut,
    je débute en shell mais je suis sous AIX et KSH également.
    j'ai eu le meme soucis que toi, je l'ai contourné comme j'ai pu
    avec la commande PASTE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ls -1 > temp
    hello=`paste -s -d";" temp`
    IFS=";"
    for z in $hello
    do
    echo $z
    done
    exit

  9. #9
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Merci.
    Ca marche !
    Dans mon cas cela donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $ cat test2.sh
    tmpfile=/tmp/tmp.$$
    ls -1 > $tmpfile
    dummy=$(paste -s -d";" $tmpfile)
    IFS=";"
    for fichier in $dummy
    do
        echo "[$fichier]"
    done

  10. #10
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Encore mieux !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    find monRep -type f | while read fichier
    do
        echo "[$fichier]"
    done

  11. #11
    DIE
    DIE est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 101
    Par défaut
    ah oui ça marche aussi, mais ça garde le chemin des fichiers
    faut faire un BASENAME qq part

    tjs plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ls | while read fichier
    do
    echo $fichier
    done
    exit
    le PASTE te servira quand tu voudras concaténer les données
    des fichiers

  12. #12
    DIE
    DIE est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 101
    Par défaut
    attention à la commande FIND, celle ci scanne automatiquement
    le répertoire mais aussi les sous-repertoires...........
    pour stopper la descente aux enfers
    il faut utiliser l'option -prune

    -prune Always evaluates to the value True. Stops the descent of the current path
    name if it is a directory. If the -depth flag is specified, the -prune flag is
    ignored.

  13. #13
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Je pense que j'ai la réponse à mon problème.

    Merci.

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

Discussions similaires

  1. [XL-2007] Boucle sur fichier Word et remplacement d'un mot
    Par kinansoag dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/03/2014, 16h04
  2. [WD15E] Boucle sur fichiers Word et remplacement d'un mot
    Par kinansoag dans le forum WinDev
    Réponses: 0
    Dernier message: 13/03/2014, 19h38
  3. programme écriture en boucle sur fichier excel
    Par varik dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 19/04/2013, 18h09
  4. [bash] Boucle sur des noms de fichiers à espaces
    Par Le Furet dans le forum Linux
    Réponses: 8
    Dernier message: 16/12/2009, 07h59
  5. Boucle sur fichier texte, tester des liens.
    Par Traquerdst dans le forum Langage
    Réponses: 13
    Dernier message: 04/11/2008, 18h48

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