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.