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 :

Incompréhension avec la commande "find"


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 55
    Par défaut Incompréhension avec la commande "find"
    Bonjour à tous,

    voilà mon souci :

    dans le cadre d'un problème que l'on m'a soumis, je cherche une solution pour renommer récursivement des noms de fichiers.
    Habituellement, j'utilise cette commande (ou dérivé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in `find . -name "*.txt"`
           do mv $i `echo $i | sed "/txt/s//doc/"`
    done
    Seulement, cette fois-ci, je suis confronté à des noms de fichiers comportant des espaces... et la commande "find" ne réagie pas du tout de la même façon.
    Elle m'affiche 2 occurences à cause d'un retour à la ligne lorsqu'elle rencontre l'espace.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in `find . -name "*.txt"`
            do mv $i `echo $i | sed "/txt/s//doc/"`
    done
    résultat :

    mv: ne peut évaluer `./test': Aucun fichier ou répertoire de ce type
    mv: ne peut évaluer `01.txt': Aucun fichier ou répertoire de ce type


    comment faire comprendre à "find" que c'est un seul et même fichier qu'il faut traiter ? j'ai parcouru le man mais, je l'avoue, sans grand résultat...

    Autre chose, en dehors d'une boucle "for", le résultat du "find" est correct...

    ./test 01.txt

    avec une boucle "for" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in `find . -name "*.txt"`
    do echo $i
    done
    résultat :

    ./test
    01.txt


    Quelqu'un peut-il éclairer ma lanterne ?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 133
    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 133
    Par défaut
    Le problème ne vient pas de find mais de for.
    for utilise le séparateur par défaut pour identifier les noms de fichier dans la liste.
    Ce séparateur est défini par la variable IFS, qui par défaut contient un espace.
    En redéfinissant le séparateur, tu pourras récupérer tes noms de fichiers, sans tenir compte des espaces.
    Tous tes noms de fichiers commençant par ., tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IFS=' ./'
    for i in $(find . -name "*.txt")
       do mv ${IFS}$i $(echo ${IFS}$i | sed "/txt/s//doc/")
    done
    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.

  3. #3
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Par défaut
    Je me permet de rajouter une petite "amélioration" qui ne tiens pas compte du fait que la recherche se fait à partir du répertoire " . "

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    IFS=$'\n' 
    for fichier in ( find / -name ".*brol" ) 
     do 
       TRAITEMENT
    done

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 55
    Par défaut
    Merci pour ces réponses rapides

    Probleme résolu, un petit peu à ma sauce...mais grace à vous.

    En fait, je declare la variable de cette façon IFS="" (donc null) et j'execute ma commande citée plus haut, et çà fonctionne.

    ps pour becket : le but n'est pas de travailler sur l'ensemble des fichiers du systeme.

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

Discussions similaires

  1. Formulaires : problème avec les slashes et les quotes
    Par GarGamel55 dans le forum Langage
    Réponses: 1
    Dernier message: 12/10/2005, 15h59

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