Matin,
Le projet actuel sur lequel je dois travailler avait un schéma de nommage précédent qui me dérange ...
Base.v2.c
Base.v2a.c
Slider.v4a.h
Area.v2a.2.h
On m'a dit que le "a" dans la version était d'identifier les versions "alpha" qui nécessitaient plus de travail. À ce stade du projet, je peux supprimer le "a" et le remplacer par un ".1" (v2a -> v2.1).
Il y a beaucoup de fichiers, au-delà de ce que je suis prêt à faire manuellement.
Je sais que je pourrais utiliser la commande rename pour renommer tous les fichiers à la fois, mais je rencontre un problème avec la façon de le faire. Si j'utilise quelque chose comme:
rename 's/[0-9]a/.1/' *
alors je perdrai le dernier chiffre du numéro de version. Existe-t-il un moyen pour que renommer (ou un autre outil en ligne de commande) se souvienne d'une partie de l'expression rationnelle utilisée pour rechercher le fichier? Ainsi, «[0-9] a» à «[0-9] .1» changerait 1a en 1.1, et 4a en 4.1, etc.
la source
v2a < v2 < 2.1
. En d'autres termes, la version deux-alpha représente la version menant à la version deux, pas la version qui la suit. Il serait préférable de le renommer en version1.99
, ou quelque chose de similaire.Réponses:
Vous pouvez soit utiliser des groupes de capture :
Ou vous pouvez utiliser un lookbehind :
Ou, semblable à un lookbehind, l'affirmation de longueur 0
\K
, qui signifie "oublier tout ce qui a correspondu jusqu'à ce point":Notez que j'ai utilisé le plus court
\d
au lieu de[0-9]
. Les deux sont équivalents, maisrename
c'est un script perl, donc comprend la syntaxe des expressions régulières compatibles Perl (PCRE).Notez que cela ne changera que la première occurrence d'un nombre suivi d'un
a
. Cela peut ou non être ce dont vous avez besoin, selon vos noms de fichiers.Les
-n
marquesrename
montrent ce que cela ferait sans rien faire. une fois que vous avez confirmé qu'il fonctionne comme prévu, supprimez-le pour modifier réellement les noms de fichiers.la source
Modifiez la commande de cette manière:
s/<souce>/<replacement>/
remplacera la chaîne source (qui pourrait être une expression régulière) par la chaîne de remplacement.(regexp)
,(string)
, etc. seront affectés en tant que valeurs de variables successives:$1
,$2
, etc ..$1
sera développée avec sa valeur, qui dans ce cas doit correspondre à l'expression rationnelle[0-9]
.la source