Les Allergies
Alimentaires
Posez votre question Signaler

Script ksh : pb espace dans nom de fichier [Résolu]

cerise59 3Messages postés 26 avril 2010Date d'inscription 15 octobre 2011Dernière intervention - Dernière réponse le 14 déc. 2011 à 10:59
Bonjour,
Je travaille sur un script (ksh) sur un serveur sous linux RH.
L'une des étapes est de déplacer des fichiers d'un répertoire vers un autre. La majeure partie des noms de ces fichiers comportent un ou plusieurs espaces. Et je ne peux pas changer les noms. Je dois conserver ces espaces.
Etant donné le nombre important de fichiers à déplacer, je passe par un " while read line" dont la source est un fichier à plat listant les fichiers.
J'ai tenté de retravailler la liste avec sed ( en encapsulant avec des ", et en protégeant l'espace avec un \ ) mais lorsque le "while read line" démarre, le script se plante car "découpe" les fichiers ( bute sur les espaces).
Bref, je suis à court d'idées et ne vois pas trop coment m'en sortir.
Si vous aviez une idée elle serait la bienvenue !
Merci d'avance
Lire la suite 

Script ksh : pb espace dans nom de fichier »

12 réponses
Réponse
+0
moins plus
Bonjour,

je ne suis pas spécialiste du ksh, mais je pense que les exemples ci-dessous devraient ouvrir une voie "royale" :

http://www.computing.net/answers/unix/how-to-remove-spaces-in-filenames/8204.html


... enfin, je crois ....


ps : j'ai bien compris le "Et je ne peux pas changer les noms. Je dois conserver ces espaces. "
cerise59- 26 avril 2010 à 20:56
Merci pour ce lien, il donne beaucoup d'idées pour contourner.
Je vais essayer de modifier mon script...
Ajouter un commentaire
Réponse
+0
moins plus
Bon je ne vois pas où est le problème ??!!

L'important c'est de quoter les variables !!!

jp@MDK:~/tmpfs ssh$ tree
.
|-- foo.sh
|-- rep cible
'-- rep source
    |-- Le jour se lève.txt
    |-- Trop tard.txt
    '-- Un jour sans fin.txt

2 directories, 4 files

jp@MDK:~/tmpfs ssh$ cat foo.sh
#! /bin/sh

#set -xv

cd "rep source"
for fich in *
do
echo "Déplacement du fichier \"${fich}\" vers \"../rep cible/\""
mv -v "${fich}" "../rep cible/"
done

jp@MDK:~/tmpfs ssh$ ./foo.sh
Déplacement du fichier "Le jour se lève.txt" vers "../rep cible/"
'Le jour se lève.txt' -> '../rep cible/Le jour se lève.txt'
Déplacement du fichier "Trop tard.txt" vers "../rep cible/"
'Trop tard.txt' -> '../rep cible/Trop tard.txt'
Déplacement du fichier "Un jour sans fin.txt" vers "../rep cible/"
'Un jour sans fin.txt' -> '../rep cible/Un jour sans fin.txt'

jp@MDK:~/tmpfs ssh$ tree
.
|-- foo.sh
|-- rep cible
|   |-- Le jour se lève.txt
|   |-- Trop tard.txt
|   '-- Un jour sans fin.txt
'-- rep source

2 directories, 4 files
jp@MDK:~/tmpfs ssh$


C'en en bash, mais je suppose qu'en ksh ça doit passer aussi. J'avais même mis des espaces dans le nom des répertoires pour corser le tout ;-))
cerise59- 27 avril 2010 à 13:12
Merci pour ton aide.
Je n'ai pas pu reproduire directement cela dans mon script. Je dois impérativement passer par ce système de liste de fichiers. En revanche, j'ai positionné des guillemets au niveau de ma variable $line, comme tu l'as fait dans ton exemple :

cat $WCM_PICTURE/liste_common_stable_test.lst|sed 's/.\///'|sed 's/ /\\ /g' >$WCM_PICTURE/liste_common_tabulee_test.lst
while read line
do
   echo $line
   mv "$line" $WCM_TRF/common/
done < $WCM_PICTURE/liste_common_tabulee_test.lst


Et ça fonctionne nickel : les fichiers sont bien déplacés et leur nom est préservé.
encore un grand merci !
bob031- 27 avril 2010 à 20:04
Clap ! Clap ! Clap ! Clap ! Clap ! Clap ! Clap ! Clap ! Clap ! Clap ! Clap ! Clap !

-:))

ben moi, je pensais que le fait d'être en ksh devait corser la chose ....

enfin, je noterai cet extrait :

En revanche, j'ai positionné des guillemets au niveau de ma variable $line,

effectivement, on retrouvait le cas du mv "$file" (et l'utilisation du awk au lieu du sed) dans les exemples proposés.

c'est peut-être ça l'effet ksh ....

^ ^
jack-ft - 14 déc. 2011 à 10:59
@cerise59
D'après moi (et mes tests), il est inutile de backslasher les espaces (le "|sed 's/ /\\ /g'" est inutile) car:
1) "read line" lit bien les lignes entières (que les espaces soient backslashées ou non)
2) dans le "mv", tu as bien pris la précaution d'entourer de guillemets le contenu de la ligne $line
Il est également inutile de créer un fichier supplémentaire.
D'où ma proposition:
cat "$WCM_PICTURE/liste_common_stable_test.lst" \
| sed 's/.\///'  \
| while read line ; do
     echo "moving '$line' ..."
     mv "$line" "$WCM_TRF/common/"
  done

Reste le uuoc... à prendre ou à laisser... chacun ses goûts!
HTH
)jack(
Ajouter un commentaire
Ce document intitulé « Script ksh : pb espace dans nom de fichier » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?