#1 Le 05/01/2008, à 16:01
- benlaug
[Résolu] Petit problème avec script Bash
Bonjour à tous,
Je me retrouve confronté à un problème (classique ?) qui est le suivant :
J'ai un fichier (par exemple nommé file) avec des emplacements de fichiers à l'intérieur. Par exemple :
/home/benlaug/a
/home/benlaug/b
...
Seulement parfois, certains fichiers ont des espaces dans leur nom :
/home/benlaug/a
/home/benlaug/b
/home/benlaug/abc def/g <== celui-là par exemple
...
Je voudrais supprimer les fichiers qui sont listés dans file. Donc j'essaye :
rm `cat file`
Evidemment, rm n'aime pas les espaces. Seulement le problème c'est que même quand je transforme :
/home/benlaug/abc def/g
en
/home/benlaug/abc\ def/g
dans le fichier ça ne marche toujours pas (alors que si je le tape manuellement directement : rm /home/benlaug/abc\ def/g ça marche).
Pour la transformation de l'espace en '\ ' j'utilise la commade suivante :
sed -i 's/\ /\\ /g' file
Quelqu'un sait ce qui ne va pas ou ce que je pourrais faire pour effacer les fichiers listés dans mon fichier file ?
Merci
Dernière modification par benlaug (Le 05/01/2008, à 17:12)
Hors ligne
#2 Le 05/01/2008, à 17:05
- Bri.
Re : [Résolu] Petit problème avec script Bash
C'est effectivement un classique, et c'est à mon avis LA tare de bash (et de pas mal de shells)...
En gros, il faut dire au shell de séparer les arguments uniquement aux changements de ligne. Avec bash, c'est la variable IFS qui régit cela.
IFS=$'\n' ; rm `cat file` ; IFS=$' \t\n'
Mais si quelqu'un a une méthode plus jolie, je suis preneur !
Faire joujou avec IFS peut entrainer des comportements bizarres dans les scripts... Pense à bien remettre la valeur par défaut ( $' \t\n' ).
Tchou!
"Ne me dites pas que ce problème est difficile; s'il n'était pas difficile, ce ne serait pas un problème." [Maréchal Foch dixit]
--
Bri.
Hors ligne
#3 Le 05/01/2008, à 17:11
- benlaug
Re : [Résolu] Petit problème avec script Bash
Ca marche impec, merci
Hors ligne
#4 Le 06/01/2008, à 15:56
- Aurel34
Re : [Résolu] Petit problème avec script Bash
tu peux aussi utiliser le classique while read, genre:
cat file | while read i; do rm "$i"; done
dans ce cas les guillements autour de $i vont "protéger" les espaces dans tes noms de fichiers.
Pour l'IFS c'est une méthode intéressante, mais assez chiante à l'usage (par exemple c'est une variable qui ne s'exporte pas, il faut alors délimiter des sous-shells avec des parenthèses...).
Mais c'est parfois indispensable...:/