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 :

problème espaces dans shell


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 27
    Points
    27
    Par défaut problème espaces dans shell
    Bonjour à tous,

    voilà dans le cadre d'un projet j'ai besoin de manipuler des noms de dossier et de fichiers et le problème se pose pour les noms contenant des espaces.

    Ainsi quand je fais un "find /home/meavy/Bureau " pour avoir tous les fichiers et dossiers contenus dans mon bureau certains dossiers avec des espaces posent problèmes. Les espaces sont interprétés comme des retours à la ligne. Par exemple, si dans mon bureau j'ai un fichier qui s'appelle "le chat gris" quand j'execute le find je trouve :
    .
    .
    .
    .

    /home/meavy/Bureau/le
    chat
    gris

    .
    .
    .
    .

    j'ai essayé de faire la commande suivante :

    find /home/meavy/Bureau | sed "s/ /\\\ /g"

    pour récupérer le résultat suivant : /home/meavy/Bureau/le\ chat\ gris

    mais ça ne marche pas ...

    avez vous des astuces ou propositions pour résoudre ce souci.


    merci d'avance pour vos réponses.


    ps:je suis sous mandriva et je developpe sous shell bash.

  2. #2
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Le problème n'est pas à chercher dans find, mais dans le programme de traitement.
    Je suppose que c'est un script shell, tu dois certainement faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for f in $(find /home/blah/truc); do
        echo '->'$f'<-';
    done
    Moi je te conseillerai plutôt de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    find /home/blah/truc | while read f; do
        echo '->'$f'<-';
    done
    En effet, read va lire une ligne et pas un "token".

    Sinon, tu peux aussi modifier la variable IFS qui continent le caractère de séparation des "tokens".

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 27
    Points
    27
    Par défaut
    salut

    merci pour ta réponse mais ça ne marche pas ... ça me retourne un truc du genre :

    .
    .
    .
    .

    /home/meavy/Bureau/le->
    <-chat
    <-gris

    .
    .
    .
    .




    heeeelp

  4. #4
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    La commande find te donne bien un nom de fichier par ligne ?
    Tu utilise bien bash comme shell ?
    Tu as bien testé l deuxième commande que je t'ai proposé et pas la première ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 27
    Points
    27
    Par défaut
    oui je suis sous bash et j'ai testé les deux commandes elles me retournent la meme chose :s

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 41
    Points : 35
    Points
    35
    Par défaut
    Salut,

    Tu écris:
    je fais un "find /home/meavy/Bureau " pour avoir tous les fichiers et dossiers contenus dans mon bureau
    Pour cela il existe la commande: ls

    Ainsi, chez moi il me suffit de faire:

    pour obtenir
    nom de fichier 1
    fichier_2
    etc

    ou encore:

    pour obtenir
    nom\ de\ fichier\ 1
    fichier_2
    etc

    Mais que veux tu faire exactement, car peut etre en détaillant plus, il y aurait une solution adéquate. Peux tu préciser le "Manipuler" des fichiers de ton premier poste.

    @+ bonne contiuation

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 27
    Points
    27
    Par défaut
    salut pinpom,

    Alors en fait pour préciser ce que je veux faire de tout ça, en fait je dois réaliser un programme de synchronisation de fichier, et tel que je l'ai conçu, il me faut récupérer le chemin absolu du fichier d'où l'utilisation du find. Aux débuts de mon programme j'avais déjà utilisé le ls mais j'ai rapidement changé pour passer au find... Et donc pour la solution du sed, ce qui me rend dingue en fait c'est que quand j'excute cette commande par exemple :

    echo "le chat et la souris" | sed "s/ /\\\ /g"

    ça me retourne le résultat que je veux ! à savoir : le\ chat\ et\ la\ souris

    par contre quand je fais :

    find /home/meavy/Bureau | sed "s/ /\\\ /g" la commande ne marche pas j'obtiens toujours des fichiers à la ligne comme ça :

    .
    .
    .
    /home/meavy/Bureau/NouveauDossier
    /home/meavy/Bureau/le
    chat
    et
    la
    souris
    /home/meavy/Bureau/AutresDossiersOuFichiers

    ça c'est pour le cas où j'ai un fichier qui s'appellerait par exemple "le chat et la souris"



  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Salut meavi,

    Je viens de lire ton post, je viens de créer sur ma console 2 fichiers texte :
    Le 1er fichier : Le chat et la souris.txt
    Le 2e fichier : Le chat et la chevre.txt
    Ces deux fichiers ont été crée dans mon répertoire /home/phil à la racine.

    Voici la ligne de commande que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/phil/ -name '*.txt' | while read line ; do echo "${line}" | sed 's/ /\\ /g'; done
    La commande find /home/phil/ -name '*.txt' me permet de faire une recherche à partir du répertoire /home/phil/ de tous les fichiers de type texte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/phil/ -name '*.txt'
    Résultat de ma commande:
    ---------------------------------------
    /home/phil/.mozilla/firefox/fzrje6lu.default/signons2.txt
    /home/phil/.mozilla/firefox/fzrje6lu.default/signons3.txt
    /home/phil/.mozilla/firefox/fzrje6lu.default/urlclassifierkey3.txt
    /home/phil/Le chat et la souris.txt
    /home/phil/.openoffice.org2/user/uno_packages/cache/log.txt
    /home/phil/.amsn/skins/aMSN Live-1.0/desc.txt
    /home/phil/Le chat et la chevre.txt

    Dans la seconde partie de ma ligne de commande aprés le pipe, j'affiche le nom du fichier texte trouvé et je viens remplacer les espaces par des '\ ' ...

    Voici le résultat final de ma commande:

    /home/phil/.mozilla/firefox/fzrje6lu.default/signons2.txt
    /home/phil/.mozilla/firefox/fzrje6lu.default/signons3.txt
    /home/phil/.mozilla/firefox/fzrje6lu.default/urlclassifierkey3.txt
    /home/phil/Le\ chat\ et\ la\ souris.txt
    /home/phil/.openoffice.org2/user/uno_packages/cache/log.txt
    /home/phil/.amsn/skins/aMSN\ Live-1.0/desc.txt
    /home/phil/Le\ chat\ et\ la\ chevre.txt

    A titre d'info, je suis sous Ubuntu et je suis en bash.
    @+

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 53
    Points : 27
    Points
    27
    Par défaut
    merci phil !

    mais si tu veux moi le souci que j'ai c'est juste de pouvoir avoir un find normal sans qu'il y ait de retour à la ligne donc si le find ne me fait pas de retour à la ligne pour des fichiers contenant des espaces eh bien pas besoin de banaliser avec les \ grâce au sed ... Mais c'est ce qui me rend dingue aussi c'est que un coup le find est normal un coup il marche pas !!!!!!!! pour la meme commande

    c'est pareil pour cette commande par exemple quand je fais

    echo "taratata" | grep -c [ta] #pour savoir si dans ma chaine il y a un "a" ou un "t"

    eh bien des fois il me met command grep not found !!!

    quelqu'un a déjà été confronté ç ce souci ???


    merci pour vos réponses

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Regarde le lien que je t'ai joint ...

    Effectivement, il n'est pas normal que tu n'arrives pas à trouver la commande grep ...
    C'est plus un problème sytème qu'un problème de shell

    @+

  11. #11
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    pinpom, le gros avantage de la commande find, c'est quand on veut parcourir récursivement les répertoires.

    meavy tes espaces sont-ils bien des vrais espaces ? Si tu as un autre caractère blanc ça expliquerait que tes noms de fichiers soient mal interprétés et si t'en met un dans la commande grep ça expliquerait qu'il trouve pas la commande en question.

    Pipe la sortie de ls ou de find sur un hexdump -C ou od -c et regarde le code de tes prétendus espaces. Un espace normal possède le code 0x20 en hexadécimal.

    Sinon, tu peux peut-être faire tout ton traitement avec la commande find et son option -exec.

Discussions similaires

  1. Problème espace dans flux XML lors de unmarshal : outils JDOM et BorlandXML
    Par alextomas dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 29/07/2011, 17h41
  2. Problème espace dans Spool vers fichier texte
    Par hatimov dans le forum PL/SQL
    Réponses: 7
    Dernier message: 25/06/2010, 18h10
  3. Problème espace dans fichier
    Par slockstone dans le forum Linux
    Réponses: 2
    Dernier message: 17/12/2008, 00h02
  4. Problème espaces dans nom de fichier
    Par Mygush dans le forum Général Java
    Réponses: 9
    Dernier message: 31/10/2008, 13h21
  5. Problème espaces dans requête
    Par dl_jarod dans le forum ASP
    Réponses: 12
    Dernier message: 12/10/2005, 13h02

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