Utilizzando rinominare, mantenendo parte del regex di ricerca


8

Mattina,

L'attuale progetto su cui devo lavorare aveva un precedente schema di denominazione che mi dava fastidio ...

Base.v2.c
Base.v2a.c
Slider.v4a.h
Area.v2a.2.h

Mi è stato detto che la "a" nella versione era identificare le versioni "alfa" che avevano bisogno di più lavoro. In questa fase del progetto posso rimuovere "a" e sostituirlo con ".1" (v2a -> v2.1).

Ci sono molti file, oltre a ciò che sono disposto a fare manualmente.

So che potrei usare il comando rename per rinominare tutti i file contemporaneamente, ma sto riscontrando un problema con come farlo. Se uso qualcosa del tipo:

rename 's/[0-9]a/.1/' *

quindi perderò l'ultima cifra del numero di versione. C'è un modo per rinominare (o un altro strumento da riga di comando) ricordare parte del regex usato per trovare il file? In modo che '[0-9] a' in '[0-9] .1' cambierebbe 1a in 1.1 e 4a in 4.1, ecc.


Questa è una cattiva idea. Di solito v2a < v2 < 2.1. In altre parole, la versione due alfa rappresenta la versione che porta alla versione due, non la versione successiva. Sarebbe meglio rinominarlo in versione 1.99o qualcosa di simile.
jpaugh

Risposte:


15

Puoi utilizzare i gruppi di acquisizione :

$ rename -n 's/(\d)a/$1.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h

Oppure puoi usare uno sguardo dietro :

$ rename -n 's/(?<=\d)a/.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h

O, simile a un lookbehind, l'affermazione a 0 \K, che significa "dimentica tutto abbinato fino a questo punto":

$ rename -n 's/\d\Ka/.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h

Nota che ho usato il più corto \dinvece di [0-9]. I due sono equivalenti, ma renameè uno script perl, quindi comprende la sintassi di Perl Compatible Regular Expressions (PCRE).

Nota che questo cambierà solo la prima occorrenza di un numero seguito da un a. Questo potrebbe essere o meno ciò di cui hai bisogno, a seconda dei nomi dei tuoi file.

Le -nmarche renamemostrano cosa farebbe senza fare davvero nulla. dopo aver verificato che funziona come previsto, rimuoverlo per modificare effettivamente i nomi dei file.


8

Modifica il comando in questo modo:

rename 's/([0-9])a/$1.1/' *
  • Il comando di sostituzione s/<souce>/<replacement>/sostituirà la stringa di origine (che potrebbe essere un'espressione regolare) con la stringa di sostituzione.
  • I gruppi di cattura - le parti della stringa di origine che sono racchiuse tra parentesi: (regexp), (string), ecc verranno assegnati come valori delle variabili successive: $1, $2, ecc ..
  • Quindi, all'interno della stringa di sostituzione, la variabile $1verrà espansa con il suo valore, che in questo caso deve corrispondere a regexp [0-9].
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.