renommer rapidement des fichiers - Shell/Batch - Programmation
Marsh Posté le 12-09-2005 à 10:11:46
En ksh :
$ for i in `\\ls -1 *new*` ; do |
EDIT : grmbl d'interprétation du backslash dans les balises fixed et cpp
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
|
ça serait denfer
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...
|
a mon avis tu est force de passer par un script du style de celui conseille par Elmoricq
Marsh Posté le 12-09-2005 à 10:15:48
|
et si on tenait vraiment à utiliser une boucle pour faire lourd, en bash :
|
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 ), utilise-le.
Marsh Posté le 12-09-2005 à 10:21:22
Elmoricq a écrit : Ca se fait sur une ligne de commande.
|
Sous nux il y est par défault il me semble , 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} ?
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.
Marsh Posté le 12-09-2005 à 10:23:26
0x90 a écrit :
|
j'ai appris un truc super aujourd'hui
rename old new *.old*
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. |
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
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
Marsh Posté le 12-09-2005 à 11:09:59
oO, t'es sur de la syntaxe la ?
Marsh Posté le 12-09-2005 à 11:13:38
tu peut faire un "rename --version" stp ?
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.
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. |
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 |
Marsh Posté le 12-09-2005 à 19:50:59
damcmoi a écrit : oui
|
Amusant qu'il y ait 2 rename tient ... vaut mieux y penser si on code des scripts destinés a être "universels"
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} :
|
Euh.
Je vais devoir faire chauffer le manpage pour comprendre comment ça marche, ce truc-là.
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 )
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.
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 ...
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