Forum Programmation.shell Script bash et espaces dans les noms de fichiers [résolu]

Posté par  (site web personnel) .
Étiquettes : aucune
1
5
oct.
2012

Bonjour,

je travaille à un petit script bash dont la fonctionnalité est de préparer une ligne de commande avec les options qui vont bien en fonction du contexte, puis de l’exécuter. Il s'agit concrètement d'utiliser gpscorrelate pour géo-taguer des photos (documentation ici).

la dernière ligne de mon script est donc
gpscorrelate -g $MonFicgierGPX -z $MaTimeZone -O $Decalage $MaListeDeFichiersPhotos

MaListeDeFichiersPhotos contient les chemins et noms des photos sélectionnées, séparés par des espaces (normal)

Tout fonctionne bien tant qu'il n'y a pas d'espace… dans le chemin et/ou le nom de mes fichiers (gpx ou jpg).

J'ai essayé avec IFS=$'\n', en échappant les espaces indésirables par sed 's/ /\ /g', sans succès.

Je sais que je suis dans un classique du genre mais cela fait 2 jours que je googuelise en vain. Quelqu'un(e) aurait-il la gentillesse d'éclairer ma lanterne ? J'ai des solutions de contournement mais j'aimerai bien comprendre quand même.

Merci d'avance.

  • # use more quotes

    Posté par  (site web personnel, Mastodon) . Évalué à 2. Dernière modification le 05 octobre 2012 à 15:23.

    Salut,

    il faut mettre des guillemets doubles autour des variables ;)

    http://mywiki.wooledge.org/WordSplitting

    On ne peut pas mettre d'array dans le string...

    • [^] # Re: use more quotes

      Posté par  . Évalué à 1.

      je suis d'accord avec serge
      gpscorrelate -g "$MonFicgierGPX" -z $MaTimeZone -O $Decalage "$MaListeDeFichiersPhotos"

      • [^] # Re: use more quotes

        Posté par  (site web personnel, Mastodon) . Évalué à 1.

        Serge ???

        On ne peut pas mettre d'array dans le string...

      • [^] # Re: use more quotes

        Posté par  (site web personnel) . Évalué à 1.

        Ben non, pas comme ça au moins. Et c'est logique, puisqu'il y a des bons (entre les fichiers) et des mauvais espaces (dans les noms de fichiers).

        J'ai essayé aussi :

        maListe="\"DSCF3813\ essai.JPG\"\ \"DSCF3813\ essai.JPG\""
        gpscorrelate -g $gpx -z +2 -O +60 $maListe
        
        Failed to open file "DSCF3813.
        Failed to open file essai.JPG".
        Failed to open file "DSCF3814.
        Failed to open file essai.JPG".
        
        

        et avec

        gpscorrelate -g $gpx -z +2 -O +60 "$maListe"
        
        Failed to open file "DSCF3813\ essai.JPG" "DSCF3814\ essai.JPG".
        
        

        3eme et 4ème tentatives avec

        maListe='DSCF3813\ essai.JPG DSCF3813\ essai.JPG'
        
        

        mêmes résultats

  • # Une solution qui marche

    Posté par  (site web personnel) . Évalué à 2.

    à force de tâtonnements…

    f[1]=\"DSCF3813\ essai.JPG\"
    f[2]=\"DSCF3814\ essai.JPG\"
    gpx=20120930.gpx
    Cde='gpscorrelate -g $gpx -z +2 -O +60 '
    for ((i = 1; i <= 2; i += 1))
    do
    Cde=$Cde${f[i]}" "
    done 
    result= eval $Cde
    
    

    Quelle suée !

    • [^] # Re: Une solution qui marche

      Posté par  . Évalué à 4.

      Il y a beaucoup plus simple, tu met chaque paramètre distinct dans un tableau, par exemple $params, puis tu profite de l'expansion du tableau dans les guillemets doubles "${params[@]}" qui va faire un mot pour chaque valeur du tableau, qu'elle contienne des espace ou non.
      cf man bash à la section Arrays

  • # Je comprend pas l'exemple ...

    Posté par  (site web personnel) . Évalué à -1.

    Je comprend pas l'exemple de la solution qui marche …

    Moi je fait comme ça (script BASH) :

    bigbob@bigbob-laptop:~$ cat essai
    #!/bin/bash
    gpx="20120930.gpx"
    Cde="gpscorrelate -g $gpx -z +2 -O +60 "
    for NomFichier in "$@"
    do
        DoubleQuotedNomFichier="\"${NomFichier}\" "
        Cde=$Cde${DoubleQuotedNomFichier}
    done
    echo "${Cde}"
    bigbob@bigbob-laptop:~$
    
    

    Ici je fais juste un 'echo' à la fin du script, toi tu execute …

    Voilà comment je l'utilise et le résultat :

    Exemple 1 ('tab completion' utilisée pour sélectionner les fichiers à traiter) :

    bigbob@bigbob-laptop:~$ ./essai Mon\ fichier\ avec\ des\ espaces\ 1.jpg Mon\ fichier\ avec\ des\ espaces\ 2.jpg Mon-fichier-sans-espaces.jpg 
    gpscorrelate -g 20120930.gpx -z +2 -O +60 "Mon fichier avec des espaces 1.jpg" "Mon fichier avec des espaces 2.jpg" "Mon-fichier-sans-espaces.jpg" 
    bigbob@bigbob-laptop:~$
    
    

    Exemple 2 ('joker' utilisé pour sélectionner les fichiers à traiter) :

    bigbob@bigbob-laptop:~$ ./essai /home/bigbob/*.jpg /home/bigbob/*.png
    gpscorrelate -g 20120930.gpx -z +2 -O +60 "/home/bigbob/free_logo-330x228.jpg" "/home/bigbob/Mon fichier avec des espaces 1.jpg" "/home/bigbob/Mon fichier avec des espaces 2.jpg" "/home/bigbob/Mon fichier avec des espaces 3.jpg" "/home/bigbob/Mon fichier avec des espaces 4.jpg" "/home/bigbob/Mon fichier avec des espaces 5.jpg" "/home/bigbob/Mon-fichier-sans-espaces.jpg" "/home/bigbob/Nokia Mail Ovi Troubles 1.jpg" "/home/bigbob/Nokia Mail Ovi Troubles 2.jpg" "/home/bigbob/Problème centre appel du Lundi 10 Octobre 2011.jpg" "/home/bigbob/120px-Iceape-icon.svg.png" "/home/bigbob/rotateme_logo.png" 
    bigbob@bigbob-laptop:~$
    
    

    Était-ce le but recherché ?

    A++

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.