¿Cambiar el nombre de varios archivos con 2 condiciones / reemplazos en una línea?


8

Estoy tratando de cambiar el nombre de algunas imágenes:

IMG_1.JPG
IMG_2.JPG
IMG_3.JPG

Quiero reemplazar IMGcon imgy .JPGcon .jpg- Sé cómo hacer la segunda parte:

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

Mi problema es que me parece que no puede mv IMG_.JPGa img_.jpg- Sé que puede pasar a múltiples patrones rename, pero me parece que no puede utilizar el nombre del archivo existente con un valor modificado en minúsculas.

¿Cómo hago esto?

Respuestas:


10

Tal vez necesite usar el comando perl rename. En mi casilla CentOS, se llama 'prename'.

$ 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
$

Si desea utilizar el renamecomando tonto de util-linux(a veces llamado rename.ul), tal vez necesite hacerlo en dos pasos, por ejemplo

$ 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
Tenga en cuenta que perl renamees anterior a la tonta que se renameencuentra en util-linux que usted llama simplemente viejorename . Incluso es anterior a Linux.
Stéphane Chazelas

6

Para responder a su pregunta en genérico,

renombrar múltiples archivos con 2 condiciones / reemplazos en una línea?

normalmente usaría grupos de captura , refiriéndose a ellos en la expresión de reemplazo usando sus correspondientes referencias inversas . Por ejemplo

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

Sin embargo, en este caso particular, sería más simple simplemente aplicar el modificador en minúsculas \Lal nombre completo:

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

Otra alternativa, usando mmv

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

(elimine el -npara realizar el cambio de nombre).


O zmv's:zmv '*.JPG' '${(L)f}'
Stéphane Chazelas

1
Una versión más simple de rename 's/.*/\L$&/' *.JPGseríarename '$_ = lc' *.JPG
hobbs

2

Utilizando mv:

sh compatible:

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

bash (gracias steeldriver):

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

Esto recorrerá todos los .JPGarchivos en el directorio actual y los renombrará con el mismo nombre con todos los caracteres en mayúsculas convertidos en caracteres en minúsculas.


1

La forma más simple y basada en la página de manual que no cubre una expresión regular :

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

En mi humilde opinión, una respuesta simple como esta logra lo que los golpes fuertes ocasionalmente no logran. Sin malicia hacia programadores experimentados, pero como la pregunta parece ser de un novato, se debe alentar la simplicidad.
Hopping Bunny
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.