renommer rapidement des fichiers

renommer rapidement des fichiers - Shell/Batch - Programmation

Marsh Posté le 12-09-2005 à 10:05:53    

Salut les gars, pitite question j'ai ça :
 

ls *.new*  
cuxetc.new0   cuxetc.new2  pdata.new0   pdata.new2  sxpetc.new0   sxpetc.new2  
cuxetc.new1   cuxetc.new3  pdata.new1   pdata.new3  sxpetc.new1   sxpetc.new3  
cuxetc.new10  cuxetc.new4  pdata.new10  pdata.new4  sxpetc.new10  sxpetc.new4  
cuxetc.new11  cuxetc.new5  pdata.new11  pdata.new5  sxpetc.new11  sxpetc.new5  
cuxetc.new12  cuxetc.new6  pdata.new12  pdata.new6  sxpetc.new12  sxpetc.new6  
cuxetc.new13  cuxetc.new7  pdata.new13  pdata.new7  sxpetc.new13  sxpetc.new7  
cuxetc.new14  cuxetc.new8  pdata.new14  pdata.new8  sxpetc.new14  sxpetc.new8  
cuxetc.new15  cuxetc.new9  pdata.new15  pdata.new9  sxpetc.new15  sxpetc.new9


 
je veux renommer tous les *new* en *old*.
je saurais bien me débrouiller avec sed ou gawk mais c'est ds un fichier texte  :( .
J'ai pas trouvé d'options dans la man rename ou mv.
 
Aparemment il va falloir faire un for (avec un sed et un mv dedans).... Ca je saurai faire.
Si vous avez une commande miracle, ça serai chouette, sinon dite moi que non lol.
Merci si vous savez et bonne journée


Message édité par damcmoi le 12-09-2005 à 10:10:06
Reply

Marsh Posté le 12-09-2005 à 10:05:53   

Reply

Marsh Posté le 12-09-2005 à 10:09:04    

ca veut dire quoi "c'est dans un fichier texte"

Reply

Marsh Posté le 12-09-2005 à 10:11:46    

En ksh :
 

$ for i in `\\ls -1 *new*` ; do
mv $i `echo $i | sed 's/new/old/' `
done


 
 
 
EDIT : grmbl d'interprétation du backslash dans les balises fixed et cpp :fou:


Message édité par Elmoricq le 12-09-2005 à 10:12:15
Reply

Marsh Posté le 12-09-2005 à 10:12:15    

je veux dire de passer par un fichier texte... et donc par un script shell avec boucle et toute l'artillerie...
 
C'est juste que si ya une commande du genre  


rename *new* *old*


 ça serait denfer ;)

Reply

Marsh Posté le 12-09-2005 à 10:12:43    

Merci les gars vous êtes trop rapides :)

Reply

Marsh Posté le 12-09-2005 à 10:13:28    

damcmoi a écrit :

je veux dire de passer par un fichier texte... et donc par un script shell avec boucle et toute l'artillerie...
 
C'est juste que si ya une commande du genre  


rename *new* *old*


 ça serait denfer ;)


 
a mon avis tu est force de passer par un script du style de celui conseille par Elmoricq

Reply

Marsh Posté le 12-09-2005 à 10:14:20    

ok j'ai adopté le script :)  
Merci infiniment à vous deux.

Reply

Marsh Posté le 12-09-2005 à 10:15:48    


rename new old *.new*


 
 
 
et si on tenait vraiment à utiliser une boucle pour faire lourd, en bash :


for f in *.new* ; do mv "$f" "${f/new/old}" ;done


Message édité par 0x90 le 12-09-2005 à 10:18:30

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 12-09-2005 à 10:19:38    

betsamee a écrit :

a mon avis tu est force de passer par un script du style de celui conseille par Elmoricq


 
Ca se fait sur une ligne de commande.
On peut même le faire en une seule ligne (c'est laid) :
 

for i in `\ls -1 *new*` ; do mv $i `echo $i | sed 's/new/old/' ` ; done


 
 
Mais si tu disposes de rename (pas standard, en tout cas moi je l'ai pas sous Solaris :sweat: ), utilise-le.

Reply

Marsh Posté le 12-09-2005 à 10:21:22    

Elmoricq a écrit :

Ca se fait sur une ligne de commande.
On peut même le faire en une seule ligne (c'est laid) :
 

for i in `\ls -1 *new*` ; do mv $i `echo $i | sed 's/new/old/' ` ; done


 
 
Mais si tu disposes de rename (pas standard, en tout cas moi je l'ai pas sous Solaris :sweat: ), utilise-le.


 
Sous nux il y est par défault il me semble [:spamafote], mais la syntaxe est légèrement différente. ( j'avais expliqué une fois il me semble dans un topic pourquoi ca pouvait pas être comme sous dos ), par contre, sous Ksh, t'as pas la feature ${i/new/old} ?  


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 12-09-2005 à 10:21:22   

Reply

Marsh Posté le 12-09-2005 à 10:22:49    

0x90 a écrit :

par contre, sous Ksh, t'as pas la feature ${i/new/old} ?


 
Nah, pas que je sache. Je viens de tester, ça ne fonctionne pas non plus.
Ca existe peut-être, je ne suis pas un guru du ksh, dans ce cas-là je veux bien savoir comment on fait ça peut m'intéresser.

Reply

Marsh Posté le 12-09-2005 à 10:23:26    

0x90 a écrit :


rename new old *.new*




 :jap:  
j'ai appris un truc super aujourd'hui  
 
rename old new *.old*


Message édité par betsamee le 12-09-2005 à 10:23:47
Reply

Marsh Posté le 12-09-2005 à 10:26:00    

Elmoricq a écrit :

Nah, pas que je sache. Je viens de tester, ça ne fonctionne pas non plus.
Ca existe peut-être, je ne suis pas un guru du ksh, dans ce cas-là je veux bien savoir comment on fait ça peut m'intéresser.


 
Possible que ce soit du bash-only, en tout cas c'est super pratique d'eviter le ``/echo/pipe/sed et sur une grosse boucle la différence doit se faire sacrément sentir :/


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 12-09-2005 à 11:08:59    

sinon je viens aussi de trouver sous debian (bash normalement)
 

rename 's/new/old/' *.new*


 
Merci encore les gars :)

Reply

Marsh Posté le 12-09-2005 à 11:09:59    

oO, t'es sur de la syntaxe la ?


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 12-09-2005 à 11:11:13    

oui
 
c sur la derniere sarge.
c une perl reg expr

Reply

Marsh Posté le 12-09-2005 à 11:13:38    

tu peut faire un "rename --version" stp ?


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 12-09-2005 à 11:14:20    

oui
2min fo que je reboot du coup lol
 
Bon alors c chaud.
j'ai pas de version pour le rename (j'ai essayé le --version et -v et le man)
La seule version que j'aie à la fin du man rename c'est :

perl v5.8.4  2005-03-08


 
sinon la syntaxe d'utilisation c'est :

rename [-v] [-n] [-f] perlexpr [files]


 
Pour info c la sarge sans ajouts, qui est en vente en ce moment chez les libraires  :??:
 
Edit http://wiki.linuxquestions.org/wiki/Rename qui explique différents rename selon les différentes distribs de linux.


Message édité par damcmoi le 12-09-2005 à 11:27:43
Reply

Marsh Posté le 12-09-2005 à 17:55:32    

Elmoricq a écrit :

Nah, pas que je sache. Je viens de tester, ça ne fonctionne pas non plus.
Ca existe peut-être, je ne suis pas un guru du ksh, dans ce cas-là je veux bien savoir comment on fait ça peut m'intéresser.


Par contre tu peux toujours faire un truc du genre ${toto%new*}old${toto##*new} :

for f in *; do mv $f ${f%new*}old${f##*new}; done

Reply

Marsh Posté le 12-09-2005 à 19:50:59    

damcmoi a écrit :

oui
2min fo que je reboot du coup lol
 
Bon alors c chaud.
j'ai pas de version pour le rename (j'ai essayé le --version et -v et le man)
La seule version que j'aie à la fin du man rename c'est :

perl v5.8.4  2005-03-08


 
sinon la syntaxe d'utilisation c'est :

rename [-v] [-n] [-f] perlexpr [files]


 
Pour info c la sarge sans ajouts, qui est en vente en ce moment chez les libraires  :??:
 
Edit http://wiki.linuxquestions.org/wiki/Rename qui explique différents rename selon les différentes distribs de linux.


 
Amusant qu'il y ait 2 rename tient ... vaut mieux y penser si on code des scripts destinés a être "universels" :/


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 12-09-2005 à 19:54:49    

matafan a écrit :

Par contre tu peux toujours faire un truc du genre ${toto%new*}old${toto##*new} :

for f in *; do mv $f ${f%new*}old${f##*new}; done



 
Euh.
Je vais devoir faire chauffer le manpage pour comprendre comment ça marche, ce truc-là.

Reply

Marsh Posté le 12-09-2005 à 20:20:57    

je dirais que le 1er suprime les occurences de new* dans le string, et le second de *new, et entre les deux, on met old ... c'est crappy crappy tout ca :/ ( enfin ca marche, et surement mieux que sed )


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 12-09-2005 à 23:21:19    

Oui c'est ca. Plus exactement, le % supprime la plus courte occurence de "new*" en fin de chaine, et le ## supprime la plus longue occurence de "*new" en debut de chaine.

Reply

Marsh Posté le 13-09-2005 à 10:16:36    

Donc ca supprime le dernier new si le fichier s'appèle pwet.new01.canard.new02 .... ca peut être un comportement utile ...


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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