Script ksh : pb espace dans nom de fichier

Résolu/Fermé
cerise59 Messages postés 8 Date d'inscription lundi 26 avril 2010 Statut Membre Dernière intervention 15 octobre 2011 - 26 avril 2010 à 20:17
 jack-ft - 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
A voir également:

8 réponses

bob031 Messages postés 8158 Date d'inscription samedi 7 août 2004 Statut Membre Dernière intervention 1 septembre 2014 472
26 avril 2010 à 20:32
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. "
0
cerise59 Messages postés 8 Date d'inscription lundi 26 avril 2010 Statut Membre Dernière intervention 15 octobre 2011
26 avril 2010 à 20:56
Merci pour ce lien, il donne beaucoup d'idées pour contourner.
Je vais essayer de modifier mon script...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
Modifié par jipicy le 26/04/2010 à 22:42
Salut,

Affiches-nous le contenu de ton script s'il te plait, s'il le faut ce n'est pas grand chose à rectifier ;-)

Édit : Affiches-nous aussi la liste des fichiers et les répertoires sources et destinations... Merci.
0
cerise59 Messages postés 8 Date d'inscription lundi 26 avril 2010 Statut Membre Dernière intervention 15 octobre 2011
27 avril 2010 à 09:39
Bonjour,

Voici l'extrait en question :

cd <répertoire_source>
#cat liste_common_stable_test.lst|sed 's/.\///'|sed 's/^/"/g'|sed 's/$/"/g'>liste_common_tabulee_test.lst	
cat liste_common_stable_test.lst|sed 's/.\///'|sed 's/ /\\ /g' >liste_common_tabulee_test.lst

while read line
do
   echo $line
   mv $line <répertoire_cible>
done < liste_common_tabulee_test.lst


J'ai testé deux façons (c'est pourquoi l'une des lignes avec sed est en commentaire)

Voici la liste de départ ( liste_common_stable_test.lst ) :

./04_Marque_PTPT_american vintage_01.gif
./04_Marque_PTPT_teddy smith_01.gif
./07_Services_PTPT_garantie 02_01.gif
./04_Marque_PTPT_littlest pet shop_01.gif
./05_Qualite_PTPT_- valeur sure_01.gif
./07_Services_PTPT_garantie best 02 ans_01.gif
./04_Marque_PTPT_ecko red girls PE10_01.gif
./04_Marque_PTPT_a l heure anglaise_01.gif
./04_Marque_PTPT_grendha PE10_01.gif
./04_Marque_PTPT_roaman s_01.gif

Merci pour votre aide
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
27 avril 2010 à 11:03
Merci.

Par contre peut-on avoir le véritable nom du répertoire cible ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cerise59 Messages postés 8 Date d'inscription lundi 26 avril 2010 Statut Membre Dernière intervention 15 octobre 2011
27 avril 2010 à 11:09
Oui, le répertoire cible s'appelle common
Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
27 avril 2010 à 11:10
Euh.. le chemin complet s'il te plait ;-))
0
cerise59 Messages postés 8 Date d'inscription lundi 26 avril 2010 Statut Membre Dernière intervention 15 octobre 2011
27 avril 2010 à 11:37
/transfert/wcm/emission/picture/common
Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
27 avril 2010 à 11:47
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 ;-))
0
cerise59 Messages postés 8 Date d'inscription lundi 26 avril 2010 Statut Membre Dernière intervention 15 octobre 2011
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 !
0
bob031 Messages postés 8158 Date d'inscription samedi 7 août 2004 Statut Membre Dernière intervention 1 septembre 2014 472
Modifié par bob031 le 27/04/2010 à 20:05
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 ....

^ ^
0
@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(
0