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 :

Noms de fichiers avec caractères à Echapper


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 40
    Par défaut Noms de fichiers avec caractères à Echapper
    Bonjour,

    Je suis face à un petit soucis.
    Je doit traiter des fichiers via un script. Ce script reçoit en paramètre le chemin complet du fichier mais comme une chaine de caractère.

    Dison que mon Script s'appelle MonScript.sh, ça va donner ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./test.sh "/home/user/dossier1/SousDossier/[blabla]blublu ABC (encore du texte).ext"
    j'ai donc la possibilité d'avoir en vrac dans la chaine de caractère : des espaces, des crochets, des parenthèses bref tout un tas de chose qui vont foutre le bazar dans mon script par la suite.

    En cherchant un peut j'ai trouvé cet example pour formater correctement ma chaine de caractères avec les caractères d'échappement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "file"with"quotes( and 'simple').ex" | sed 's/\([\() '\''"]\)/\\\1/g'
    Quand je l'utilise dans le shell avec mes fichiers non traités ça fonctionne correctement mais impossible de l'utiliser dans mon script.

    J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
     
    CHEMINFICHIER=$1
     
    CHEMINFICHIER=${echo '$CHEMINFICHIER' | sed 's/\([\() '\''"]\)/\\\1/g'}
    echo "Chemin Propre $CHEMINFICHIER"
    mais j'ai ce message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./MonScript.sh: ligne5: ${echo '$CHEMINFICHIER' | sed 's/\([\() '\''"]\)/\\\1/g'} : mauvaise substitution
    du coup je ne sais plus du tout quoi faire :
    -- j'ai essayé de passer par un eval sans succès
    -- j'ai essayé d'insérer des caractères d'échappement pareil ça merde....

    Comme je ne m'y connais pas assez pour savoir ce que je fais de mal je me tourne vers vous...
    si une âme charitable pouvait m'aider se serait génial....

    Merci d'avance.

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 297
    Par défaut
    Bonjour

    Pas besoin d'outil externe (à bash):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ toto="/home/user/dossier1/SousDossier/[blabla]blublu ABC (encore du texte).ext"                                                                                                                  
    $ echo $toto
    /home/user/dossier1/SousDossier/[blabla]blublu ABC (encore du texte).ext
    $ echo ${toto//[^-a-zA-Z0-9._\/]/}
    /home/user/dossier1/SousDossier/blablablubluABCencoredutexte.ext

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 40
    Par défaut
    Bonjour,

    Merci pour ta réponse mais ce que je voudrais c'est conserver le nom du fichier mais avec les caractères d'échappement placés où c'est nécessaire.
    En effet je souhaite utiliser la chaine de caractères du chemin complet avec les caractères d'échappement pour traiter le fichier.

    En gros je veux partir de ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /home/user/dossier1/SousDossier/[blabla]blublu ABC (encore du texte).ext
    et arriver à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /home/user/dossier1/SousDossier/\[blabla\]blublu\ ABC\ \(encore du texte\).ext
    mais je voudrais que ce soit valable pour tous les cas possibles (partout ou un caractère d'échappement est nécessaire dans un nom de fichier).

    En espérant être claire dans mon explication.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    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 136
    Par défaut
    C'est l'échappement du caractère ' dans ta commande sed qui pose problème.
    Essaie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/\([\() '"'"'"]\)/\\\1/g'
    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.

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 297
    Par défaut
    je voudrais que ce soit valable pour tous les cas possibles
    Perdu!

    Dans certains cas, ( sera une parenthèse et dans d'autres cas \( sera une parenthèse.

    Je ne vois pas l'intérêt de ce que tu fais.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 40
    Par défaut
    Merci pour les réponses,

    Alors ce que j'essaye de faire :
    j'ai des fichiers vers lesquels pointent des Hardlinks, du coup lorsque je veux supprimer ces fichiers, je veux les supprimer via leurs inodes.
    Le truc c'est que le nom des fichiers contient parfois des caractères à échapper.

    Du coup en continuant à chercher j'ai vu qu'on pouvais forcer la lecture du param avec des guillemets...
    ça a donc résolu pas mal de mes problèmes mais ça a tout reporter sur la fin lorsque je lance la commande Find -exec rm

    Comme j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /home/ -inum $INODE -exec rm {} \;
    malgré le fait d'avoir réussi à récupérer l'inode du fichier avec des espaces toussa... et bien la commande find, elle, renvoie de nouveau une version avec espace qui n'est pas correctement interprété par rm...

    j'ai essayé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    COMMANDE="find /home/ -inum $INODE -exec rm \"{}\" \\;"
    eval $COMMANDE
    mais ça plante...

    je suis au bord de la rupture


    j'en suis venu à ce script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #!/bin/bash
     
    CHEMIN="$1"
    UTILISATEUR="gormson"
     
    #Recuperation de l'inode du CHEMIN à supprimer
    #Traitement différent dans le cas d'un dossier
    if [ -d "$CHEMIN" ]
    then
            #Ecriture de l'ensemble du contenu du dossier dans un fichier tampon
            echo "-------------------------------------------------------------------" >> /home/$UTILISATEUR/.session/inode.log
            echo "-------------------------------------------------------------------" >> /home/$UTILISATEUR/.session/inode.log
            echo "Traitement Dossier $CHEMIN" >> /home/$UTILISATEUR/.session/inode.log
     
            #Creation d'une variable commande 
            COMMANDE="ls \"$CHEMIN\""
            eval $COMMANDE >> /home/$UTILISATEUR/.session/inodedossier.log
     
            #Lecture de chaque nom de fichier et traitement
            while read -r ENCOURS; do
     
                    echo "Traitement fichier $ENCOURS" >> /home/$UTILISATEUR/.session/inode.log
     
                    COMMANDE="ls -i \"$CHEMIN\"/\"$ENCOURS\" | sed -e \"s|$CHEMIN/$ENCOURS||\""
                    INODE=$(eval $COMMANDE)
     
                    #Sauvegarde de l'inode et du nom du fichier correspondant dans un log
                    echo "-------------------------------------------------------------------" >> /home/$UTILISATEUR/.session/inode.log
                    echo "Suppression inode $INODE | fichier $ENCOURS" >> /home/$UTILISATEUR/.session/inode.log
     
                    #Suppresion de tous les fichiers associes
                    find /home/ -inum $INODE -exec rm {} \;
     
                    #Verification de la bonne suppression des fichiers
                    find /home/ -inum $INODE >> /home/$UTILISATEUR/.session/inodefailed.log
     
            done < /home/$UTILISATEUR/.session/inodedossier.log
     
            rm -f /home/$UTILISATEUR/.session/inodedossier.log
     
            COMMANDE="ls -id \"$CHEMIN\" | sed -e \"s|$CHEMIN ||\""
            INODE=$(eval $COMMANDE)
            echo "Suppresion du Dossier $CHEMIN" >> /home/$UTILISATEUR/.session/inode.log
            echo "Suppression inode $INODE | fichier $CHEMIN" >> /home/$UTILISATEUR/.session/inode.log
            find /home/ -inum $INODE -exec rm -R {} \;
     
            #Verification de la bonne suppression des fichiers
            find /home/ -inum $INODE >> /home/$UTILISATEUR/.session/inodefailed.log
    else
            echo "Traitement Mode Fichier"
     
            COMMANDE="ls -i \"$CHEMIN\" | sed -e \"s|$CHEMIN ||\""
            INODE=$(eval $COMMANDE)
     
            #Sauvegarde de l'inode et du nom du fichier correspondant dans un log
            echo "-------------------------------------------------------------------" >> /home/$UTILISATEUR/.session/inode.log
            echo "-------------------------------------------------------------------" >> /home/$UTILISATEUR/.session/inode.log
            echo "Suppression inode $INODE | fichier $TORRENTPATH" >> /home/$UTILISATEUR/.session/inode.log
     
            COMMANDE="find /home/ -inum $INODE -exec rm \"{}\" \\;"
            eval $COMMANDE
            #Verification de la bonne suppression des fichiers
            find /home/ -inum $INODE >> /home/$UTILISATEUR/.session/inodefailed.log
    fi

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

Discussions similaires

  1. [Batch] Récupérer le nom de fichier avec des caractères inconnus
    Par Christophe.G dans le forum Scripts/Batch
    Réponses: 11
    Dernier message: 26/12/2014, 16h24
  2. Trouver des noms de fichiers avec des caractères non ASCII
    Par llaffont dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 16/10/2012, 14h06
  3. Noms de fichiers avec des caractères spéciaux
    Par weabow dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 24/11/2010, 15h51
  4. [Upload] Nom de fichier avec un/des caractères accentués ?
    Par Christophe Charron dans le forum Langage
    Réponses: 11
    Dernier message: 09/06/2006, 21h46
  5. changement de nom de fichier avec smartupload
    Par bourvil dans le forum ASP
    Réponses: 2
    Dernier message: 24/05/2004, 14h50

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