Rinominare più file con 2 condizioni / sostituzioni in una riga?


8

Sto cercando di rinominare alcune immagini:

IMG_1.JPG
IMG_2.JPG
IMG_3.JPG

Voglio sostituire IMGcon imge .JPGcon .jpg: so come fare la seconda parte:

$ rename 's/\.JPG$/\.jpg/' *.JPG

Il mio problema è che non riesco a mv IMG_.JPGfarlo img_.jpg- so che puoi passare più pattern a rename, ma non riesco a usare il nome file esistente con un valore minuscolo modificato.

Come posso procedere?

Risposte:


10

Forse devi usare il comando perl rename. Sulla mia scatola CentOS, si chiama "nome".

$ ls
IMG_1.JPG  IMG_2.JPG  IMG_3.JPG
$ prename 's/^IMG/img/;s/\.JPG$/\.jpg/' *JPG
$ ls
img_1.jpg  img_2.jpg  img_3.jpg
$

$ prename -h
Usage: prename [OPTION]... PERLEXPR FILE...
Rename FILE(s) using PERLEXPR on each filename.

  -b, --backup                  make backup before removal
  -B, --prefix=SUFFIX           set backup filename prefix
  -f, --force                   remove existing destinations, never prompt
  -i, --interactive             prompt before overwrite
  -l, --link-only               link file instead of reame
  -n, --just-print, --dry-run   don't rename, implies --verbose
  -v, --verbose                 explain what is being done
  -V, --version-control=METHOD  override the usual version control
  -Y, --basename-prefix=PREFIX  set backup filename basename prefix
  -z, -S, --suffix=SUFFIX       set backup filename suffix
      --help                    display this help and exit
      --version                 output version information and exit

The backup suffix is ~, unless set with SIMPLE_BACKUP_SUFFIX.  The
version control may be set with VERSION_CONTROL, values are:

  numbered, t     make numbered backups
  existing, nil   numbered if numbered backups exist, simple otherwise
  simple, never   always make simple backups

Report bugs to pederst@cpan.org
$

Se si desidera utilizzare il renamecomando muto da util-linux(a volte chiamato rename.ul), forse è necessario farlo in due passaggi, ad es

$ ls
IMG_1.JPG  IMG_2.JPG  IMG_3.JPG
$ rename IMG img *JPG
$ rename JPG jpg *JPG
$ ls
img_1.jpg  img_2.jpg  img_3.jpg
$

3
Nota che perl renameprecede il muto renametrovato in util-linux che chiami semplicemente vecchiorename . Anticipa persino Linux.
— Stéphane Chazelas,

6

Per rispondere alla tua domanda nel generico,

rinominare più file con 2 condizioni / sostituzioni in una riga?

in genere si utilizzano i gruppi di acquisizione , facendo riferimento ad essi nell'espressione sostitutiva utilizzando le rispettive risposte secondarie . Per esempio

$ rename -n 's/^(.*)_(.*)\.JPG$/\L$1_$2.jpg/' *.JPG
rename(IMG_2.JPG, img_2.jpg)
rename(IMG_3.JPG, img_3.jpg)

Tuttavia, in questo caso particolare, sarebbe più semplice applicare il modificatore minuscolo \Lall'intero nome:

$ rename -n 's/.*/\L$&/' *.JPG
rename(IMG_2.JPG, img_2.jpg)
rename(IMG_3.JPG, img_3.jpg)

Un'altra alternativa, usando mmv

$ mmv -n '*.JPG' '#l1.jpg'
IMG_2.JPG -> img_2.jpg
IMG_3.JPG -> img_3.jpg

(rimuovere -nper eseguire effettivamente la ridenominazione).


Oppure zmv:zmv '*.JPG' '${(L)f}'
— Stéphane Chazelas,

1
Una versione più semplice rename 's/.*/\L$&/' *.JPGsarebberename '$_ = lc' *.JPG
— hobbs,

2

Utilizzando mv:

sh compatibile:

for file in *.JPG; do mv "$file" "$(echo "$file" | tr '[:upper:]' '[:lower:]')"; done

bash (Grazie steeldriver):

for file in *.JPG; do mv "$file" "${file,,}"; done

Questo eseguirà il ciclo tra tutti i .JPGfile nella directory corrente e li rinominerà con lo stesso nome con tutti i caratteri maiuscoli convertiti in caratteri minuscoli.


1

Il modo più semplice e basato sulla pagina man che non copre un'espressione regolare :

rename 'IMG' 'img' * ; rename 'JPG' 'jpg' *

IMHO, una risposta semplice come questa raggiunge ciò che occasionalmente non riesce a colpire. Nessuna cattiveria nei confronti di programmatori esperti, ma poiché la domanda sembra provenire da un principiante, la semplicità deve essere incoraggiata.
— Hopping Bunny
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.