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" :
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" ; doneNe 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 -1dans un fichier temporaire).Note 1 : l’exemple utilise
ls -1et non le simplelspour ê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