Al momento sto cercando di rinominare un ampio set di file e ho utilizzato metodi piuttosto ingannevoli per farlo, come ad esempio:
rename 's:(.*).MOV:$1.mov:g' *.MOV
rename 's:(.*).JPG:$1.jpg:g' *.JPG
Quello che mi piacerebbe davvero fare è poter combinare tutti questi comandi usando la 'y' sed
operatore. Evidentemente, utilizzando questo operatore, puoi trasformare gli elementi in minuscolo. Il problema è che devo convertire solo le estensioni. C'è un modo per farlo usando questo comando? Devo essenzialmente trasformare il gruppo di acquisizione nella seguente espressione in minuscolo:^.+.(.+)$
. C'è un modo per fare questo? Sono un po' nuovo a questo tipo di trasformazioni.
Risposta accettata:
Questo è il rename
basato su Perl trovato su Debian, Ubuntu e derivati, a giudicare dalla sintassi. Non puoi usare il tr
operatore perché agisce sull'intera stringa. Ma puoi abbinare l'estensione e minuscola con L
.
rename 's/.[^.]*$/L$&/' *.JPG *.MOV
Qui non è necessario, ma se l'espressione regolare corrisponde più della parte che vuoi ridurre in minuscolo, puoi mettere la parte da abbinare in un gruppo:
rename 's/.([^.]*)$/.L$1/' *.JPG *.MOV
Sostituisci *.JPG *.MOV
per *.*
per agire su tutti i file indipendentemente dall'estensione. In bash ≥4.3 (e anche in bash 4.0–4.2, con l'avvertenza che questo attraversa anche collegamenti simbolici alle directory), puoi facilmente agire sui file nelle sottodirectory e così via in modo ricorsivo:
rename 's/.[^.]*$/L$&/' **/*.*
Per i fan di zsh (il :r
e :e
i modificatori isolano l'estensione dal resto del file):
autoload zmv
zmv '*.(MOV|JPG)' '${f:r}.${(L)f:e}' # these extensions, current directory
zmv '*.*' '${f:r}.${(L)f:e}' # all extensions, current directory
zmv '**/*.*' '${f:r}.${(L)f:e}' # all extensions, recursive directory traversal