Accueil > ... > Forum 66

Subversion : export des fichiers depuis une révision en bash

25 janvier 2010, 11:36, par Tix

Bonjour Julien,

Merci pour ton script qui correspond à ce que je cherchais.

En ce qui concerne le problème récurrent (et ô combien pénible...) de la gestion des noms de fichiers contenant des espaces, tu peux utiliser la commande bash "while read" (+ pipe ou fichier) au lieu du classique "for" qui, en effet, posera toujours problème.

Exemples d’utilisation dans un répertoire contenant des fichiers avec des espaces :

$ for i in ls -1 ; do file "$i" ; done

Ne marche pas avec les fichiers ayant des espaces...

$ ls -1 | while read i ; do file "$i" ; done

Fonctionne avec les fichiers ayant des espaces... (sans utiliser de fichier temporaire).

$ ls -1 > temp.txt ; while read i ; do file "$i" ; done < temp.txt

Fonctionne avec les fichiers ayant des espaces... (en écrivant le résultat de ls -1 dans un fichier temporaire).

Note 1 : l’exemple utilise ls -1 et non le simple ls pour être certain d’avoir un seul nom de fichier par ligne (important pour que "while read" fonctionne...)

Note 2 : il est très important de protéger la variable $i par des guillemets dans la boucle, sinon les espaces poseront toujours problème et le "while read" n’aura servi à rien... De même pour tout ton (tes) script(s), il est fortement recommandé de protéger toutes les variables $1, $2, $3, $myfile et $outfile par des guillemets pour les mêmes raisons. ;-)

Note 3 : l’exemple numéro 2 (avec un pipe) posera un problème de visibilité d’éventuelles variables à l’intérieur de la boucle depuis l’extérieur car l’utilisation d’un pipe déclenche l’exécution de la boucle dans un sous-process par le shell, sous-process qui empêchera l’export des variables en sortie de la boucle (ça va ? J’ai perdu personne ? :-). Dans ce cas, l’utilisation de l’exemple 3 avec un fichier temporaire est la solution possible à ma connaissance. Exemples :

$ flag=0 ; ls -1 | while read i ; do file "$i" ; flag=1 ; done ; echo "flag=$flag"

flag=0 # Et oui ! C’est très déroutant !

$ flag=0 ; ls -1 > temp.txt ; while read i ; do file "$i" ; flag=1 ; done < temp.txt ; echo "flag=$flag"

flag=1 # Ouf ! Cette fois, c’est bon !

Remarque : je conseille au passage la lecture (longue mais très enrichissante) de l’excellent "Avanced Bash-Scripting Guide" :

http://tldp.org/LDP/abs/abs-guide.pdf