Creation de repertoires relatifs à des noms de fichiers

Creation de repertoires relatifs à des noms de fichiers - Shell/Batch - Programmation

Marsh Posté le 18-04-2006 à 18:14:39    

Bonjour a tous,  
 
j'ai un petit soucis et je vous serai gré de bien vouloir me donner un coup de pouce ;) Alors merci d'avance ^^
J'ai un certain nombre de fichiers dans un repertoire REP1... ces fichiers sont de la forme * - *.???
 
Prenons le cas de trois d'entre eux et nommons les "ile de la reunion - sequence plage.mpg" "ile de la reunion - sequence montagne.mpg" "anniversaire de bidule - sequence machin.mpg". Pour simplifier la compréhension un fichier sera ensuite désigné comme suit : préfixe-suffixe.ext
Je veux ecrire un tout petit script qui va me creer les repertoires "ile de la reunion" et "anniversaire de bidule" de manière expensive (comme j'ai une tonne de séquences et une tonne de préfixes, je n'ai pas envie de le faire a la main)
 
je commence donc par faire un test dans le repertoire en me plaçant a l'interieur de celui-ci avec quelque chose du genre :

ls *.mpg | awk -F " - " '{print $1}'


j'obtiens la liste suivante :

anniversaire de bidule
ile de la reunion
ile de la reunion


 
jusque là ça va ^^
pour pouvoir creer les repertoires je met tout ca dans un boucle for ^^:

for i in *.mpg; do mkdir `echo $i | awk -F " - " '{print $1}'`; done


et là le drame: je me retrouve avec les repertoires suivants :

anniversaire
bidule
de
ile
la
reunion


 
Donc je resume ma requete : si une ame charitable pouvait m'indiquer comment creer ces dossiers et deplacer les "bons" fichiers a l'interieur ce serait plus que genereux ^^
 
Merci et ++

Message cité 1 fois
Message édité par soniclemolasson le 18-04-2006 à 19:31:07

---------------
"The soul of a Mac is in its OS not in its processor"
Reply

Marsh Posté le 18-04-2006 à 18:14:39   

Reply

Marsh Posté le 19-04-2006 à 00:47:03    

# modifier la variable environnement IFS
# afin qu "echo" prenne en compte des retours ligne
# comme séparateur et non des espaces
OLDIFS=IFS
IFS='
'
for i in *.mpg; do mkdir `echo $i | awk -F " - " '{print $1}'`; done
#restauration de l environnement initial
IFS=OLDIFS
unset OLDIFS

Reply

Marsh Posté le 19-04-2006 à 11:21:40    

skyofdiamonds a écrit :

# modifier la variable environnement IFS
# afin qu "echo" prenne en compte des retours ligne
# comme séparateur et non des espaces
OLDIFS=IFS
IFS='
'
for i in *.mpg; do mkdir `echo $i | awk -F " - " '{print $1}'`; done
#restauration de l environnement initial
IFS=OLDIFS
unset OLDIFS


 
T'es vraiment un dieu mec ;) merci, merci, merci, ... ^^


---------------
"The soul of a Mac is in its OS not in its processor"
Reply

Marsh Posté le 19-04-2006 à 12:41:33    

skyofdiamonds a écrit :

# modifier la variable environnement IFS
# afin qu "echo" prenne en compte des retours ligne
# comme séparateur et non des espaces
OLDIFS=IFS
IFS='
'
for i in *.mpg; do mkdir `echo $i | awk -F " - " '{print $1}'`; done
#restauration de l environnement initial
IFS=OLDIFS
unset OLDIFS


 
Personnellement (mais cela ne regarde que moi), je n'aime pas toucher à l'IFS si je peux m'en passer. Ce n'est pas le cas ici mais imagine que dans le "for", l'IFS d'origine soit nécessaire...
 

soniclemolasson a écrit :

for i in *.mpg; do mkdir `echo $i | awk -F " - " '{print $1}'`; done


et là le drame: je me retrouve avec les repertoires suivants :

anniversaire
bidule
de
ile
la
reunion




 
Le pb du for, c'est qu'il utilise l'IFS (l'espace par défaut) pour séparer ses éléments et que les noms des fichiers contiennent des espaces donc tu te retrouves pour un seul fichier avec une itération sur le début, et une sur la fin du nom.
Utilises donc la commande "read" qui, elle, sépare d'office chaque élément sur le "retour charriot" et qui, comble du bonheur, renvoie "faux" quand elle n"a rien lu...

ls *.mpg |while read i
do
    mkdir `echo $i | awk -F " - " '{print $1}'`
done


Plus élégant non ???

Message cité 1 fois
Message édité par Sve@r le 19-04-2006 à 13:26:43

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 19-04-2006 à 23:35:48    

Sve@r a écrit :

Personnellement (mais cela ne regarde que moi), je n'aime pas toucher à l'IFS si je peux m'en passer. Ce n'est pas le cas ici mais imagine que dans le "for", l'IFS d'origine soit nécessaire...
 
 
 
Le pb du for, c'est qu'il utilise l'IFS (l'espace par défaut) pour séparer ses éléments et que les noms des fichiers contiennent des espaces donc tu te retrouves pour un seul fichier avec une itération sur le début, et une sur la fin du nom.
Utilises donc la commande "read" qui, elle, sépare d'office chaque élément sur le "retour charriot" et qui, comble du bonheur, renvoie "faux" quand elle n"a rien lu...

ls *.mpg |while read i
do
    mkdir `echo $i | awk -F " - " '{print $1}'`
done


Plus élégant non ???


 
Tout à fait !
mais la commande read utilise aussi IFS
 
    IFS   Internal field separators, normally  space,  tab,  and
           new-line that are used to separate command words which
           result from command or parameter substitution and  for
           separating  words  with  the special command read. The
           first  character  of  the  IFS  variable  is  used  to
           separate  arguments for the $* substitution (See Quot-
           ing below).

et
   read [ -prsu[ n ] ] [ name?prompt ] [ name ... ]
           The shell input mechanism. One line  is  read  and  is
           broken  up  into fields using the characters in IFS as
           separators.

 
extrait dehttp://www.manpages.info/sunos/ksh.1.html
 

Reply

Marsh Posté le 20-04-2006 à 09:04:48    

skyofdiamonds a écrit :

Tout à fait !
mais la commande read utilise aussi IFS


Exact. Elle utilise l'IFS quand on tape

read x y z


et qu'on rentre plusieurs mots. Là, elle utilise l'IFS pour séparer les mots et placer le premier dans "x", le second dans "y" et le reste de la ligne dans "z".
 
En fait, je n'ai pas dit qu'elle n'utilisait pas l'IFS (ou si je l'ai laissé entendre c'est bien involontaire...), j'ai dit que j'utilisais une propriété particulière de "read" qu'on n'a pas avec le "for" qui est de placer tout ce qui a été tapé jusqu'au retour charriot dans la variable demandée (ou dans la dernière variable dans le cas d'un "read x y z" ).
Grace à ça, je récupère dans "i" chaque ligne issue de "ls *.mpg" même si la ligne possède des espaces.  Mais le fait de posséder cette propriété particulière n'empêche pas "read" d'utiliser, par ailleurs, l'IFS...


Message édité par Sve@r le 20-04-2006 à 14:53:25

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed