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

Linux Discussion :

[bash] Boucle sur des noms de fichiers à espaces


Sujet :

Linux

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Points : 230
    Points
    230
    Par défaut [résolu] [bash] Boucle sur des noms de fichiers à espaces
    Bonsoir,

    je veux faire une boucle qui porte sur tous les fichiers d'un répertoire, sous-répertoires inclus. Naïvement, j'ai tapé :

    for fichier in $(find -name "*.pdf")

    Le problème est que si des espaces se cachent dans les noms de fichiers, ça coupe les noms de fichiers. Par exemple, si le répertoire courant contient un seul fichier "toto titi.pdf", dans ma boucle, fichier vaut successivement "toto" puis "titi.pdf", ce qui n'est pas du tout le résultat attendu.

    Que faire, mon Dieu que faire ?

  2. #2
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Je ne sais pas ce que tu as comme OS car chez moi (Debian), la syntaxe find est différente.
    Essaye donc avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for fichier in $(ls *.pdf)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    utilise plus de guillemets, Le Furet !

    on ne fait pas for ...$(find...); do...
    c'est soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find $REP -type f -name "*.pdf" -exec ...
    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash
     
    recurs() {
    rep="$1"
    for fichier in "$rep"/*; do 
       if [ -f "$fichier" ]; then
          echo "Traitement $fichier"
       elif [ -d "$fichier" ]; then
          recurs "$fichier"
       fi
    done
    }
    REP="$1"
    [ -d "$REP" ] && recurs "$REP" || echo "Il faut indiquer un répertoire existant"
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Le Furet Voir le message
    Que faire, mon Dieu que faire ?
    Utiliser un outil autre qui ne se base pas sur les espaces pour découper ses éléments. Comme par exemple le read...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    find -name "*.pdf" -print |while read fichier
    do
        echo "[$fichier]"
    done

    Citation Envoyé par fransoo Voir le message
    Je ne sais pas ce que tu as comme OS car chez moi (Debian), la syntaxe find est différente.
    Sa syntaxe find est parfaite et correspond à sa préconisation. De plus, je ne vois pas en quoi une distribution ou une autre pourrait influer sur la syntaxe d'une commande. J'aimerais bien que tu dises en quoi chez-toi elle est différente (pour info, je suis aussi sur Debian Lenny)...
    Citation Envoyé par fransoo Voir le message
    Essaye donc avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for fichier in $(ls *.pdf)
    Idem (sauf que le find offre une recherche en profondeur ce que ne fait pas ton ls). Mais le problème exposé par Le Furet ne vient pas de la commande utilisée... mais de l'outil permettant de découper son résultat en élémentss individuels. Quelle que soit la commande, si celle-ci renvoie des infos avec espace, le for est inadéquat pour la traiter...

    Citation Envoyé par N_BaH Voir le message
    utilise plus de guillemets, Le Furet !

    on ne fait pas for ...$(find...); do...
    c'est soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find $REP -type f -name "*.pdf" -exec ...
    soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash
     
    recurs() {
    rep="$1"
    for fichier in "$rep"/*; do 
       if [ -f "$fichier" ]; then
          echo "Traitement $fichier"
       elif [ -d "$fichier" ]; then
          recurs "$fichier"
       fi
    done
    }
    REP="$1"
    [ -d "$REP" ] && recurs "$REP" || echo "Il faut indiquer un répertoire existant"
    Ca marche (sous réserve qu'on gère aussi les liens symboliques sinon la récursion risque de partir en torche) mais c'est un peu compliqué pour régler un simple problème de for non ?
    Et si son problème n'avait pas été sur un "find" mais sur une autre commande (par exemple ping ou traceroute) ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Points : 230
    Points
    230
    Par défaut
    Merci beaucoup pour les réponses. Effectivement, j'utilisais un find plutôt qu'un ls parce qu'avec find je récupérais les fichiers de toute l'arborescence.

    Par contre, je me rends compte que, contrairement à ce que je pensais, bash est un outil pas évident à prendre en main, en ce sens que c'est pas en lisant quelques sources et en adaptant qu'on comprend bien ce que l'on fait.

    Qu'y-a-t-il comme tutoriaux corrects (anglais ou français) sur le web à lire ? J'ai vu beaucoup de choses plus ou moins encyclopédiques (plus de 500 pages), mais peu d'articles simples pour démarrer (et notamment rien sur developpez, incroyable !)

  6. #6
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    abs.traduc.org/abs-5.3-fr est très bien fait avec beaucoup d'exemples. Je conseille même de le télécharger pour pouvoir le lire hors ligne et éventuellemnt y apporter des modifs personelles.
    En pièce jointe : un petit aide-mémoire que je trouve très utile.
    Images attachées Images attachées

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    Effectivement, Sve@r, pour une série de pings, je pencherais a priori pour un pipe vers while read.
    m'enfin, avec bash ce serait plus certainement une 'substitution de processus' redirigée vers un while read :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read ...; do
    ...
    done < <(ping ...)
    Je n'ai encore pas eu de problèmes avec des liens, mais je vais faire attention.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    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 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Le Furet Voir le message
    Merci beaucoup pour les réponses. Effectivement, j'utilisais un find plutôt qu'un ls parce qu'avec find je récupérais les fichiers de toute l'arborescence.

    Par contre, je me rends compte que, contrairement à ce que je pensais, bash est un outil pas évident à prendre en main, en ce sens que c'est pas en lisant quelques sources et en adaptant qu'on comprend bien ce que l'on fait.

    Qu'y-a-t-il comme tutoriaux corrects (anglais ou français) sur le web à lire ? J'ai vu beaucoup de choses plus ou moins encyclopédiques (plus de 500 pages), mais peu d'articles simples pour démarrer (et notamment rien sur developpez, incroyable !)
    Cours de Shell Linux : http://linux.developpez.com/cours/
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 277
    Points : 230
    Points
    230
    Par défaut
    Merci beaucoup

Discussions similaires

  1. [XL-2007] Problématique de recherches et de copie sur des noms de fichiers
    Par stroutz dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/06/2013, 17h00
  2. Boucle sur les noms de fichier d'un répertoire
    Par bilou_12 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/04/2012, 12h12
  3. LogRotate basé sur des noms de fichiers
    Par pitchalov dans le forum Vos Contributions VBScript
    Réponses: 0
    Dernier message: 24/02/2010, 18h51
  4. test sur des noms de fichiers php
    Par argonath dans le forum Langage
    Réponses: 5
    Dernier message: 27/09/2009, 22h47
  5. boucle sur des noms de répertoires
    Par machmalabala dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 29/08/2007, 12h34

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