Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1701 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Creation de repertoires relatifs à des noms de fichiers

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Creation de repertoires relatifs à des noms de fichiers

n°1349078
soniclemol​asson
Posté le 18-04-2006 à 18:14:39  profilanswer
 

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"
mood
Publicité
Posté le 18-04-2006 à 18:14:39  profilanswer
 

n°1349296
skyofdiamo​nds
Posté le 19-04-2006 à 00:47:03  profilanswer
 

# 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

n°1349443
soniclemol​asson
Posté le 19-04-2006 à 11:21:40  profilanswer
 

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"
n°1349552
Sve@r
Posté le 19-04-2006 à 12:41:33  profilanswer
 

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.
n°1350142
skyofdiamo​nds
Posté le 19-04-2006 à 23:35:48  profilanswer
 

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
 

n°1350207
Sve@r
Posté le 20-04-2006 à 09:04:48  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Creation de repertoires relatifs à des noms de fichiers

 

Sujets relatifs
remplacer les fichiers d'un dossier par d'autres[DELPHI] Enregistrement de fichiers texte
creation des instrances d'objet contexte Probleme ?recherche de fichiers catia
Creation dynamic de tableaux javacreation des fonctions sous oracle
Concaténation de fichiers PDF avec PHPLister les fichiers d'un répertoire à partir d'un smbclient
création de miniature tiff > jpeg en phpsoucis pour la création d'un lien de téléch d'un fichier csv
Plus de sujets relatifs à : Creation de repertoires relatifs à des noms de fichiers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR