Actualmente estoy tratando de cambiar el nombre de un gran conjunto de archivos y he estado usando métodos bastante torpes para hacerlo, como:
rename 's:(.*).MOV:$1.mov:g' *.MOV
rename 's:(.*).JPG:$1.jpg:g' *.JPG
Lo que realmente me gustaría hacer es poder combinar todos estos comandos usando la 'y' sed
operador. Evidentemente, usando este operador, puede transformar elementos a minúsculas. El problema es que necesito convertir solo las extensiones. ¿Hay alguna manera de hacer esto usando este comando? Básicamente, necesito transformar el grupo de captura en la siguiente expresión a minúsculas:^.+.(.+)$
. ¿Hay alguna forma de hacer esto? Soy un poco nuevo en este tipo de transformaciones.
Respuesta aceptada:
Ese es el rename
basado en Perl encontrado en Debian, Ubuntu y derivados, a juzgar por la sintaxis. No puedes usar el tr
operador porque actúa sobre toda la cadena. Pero puede hacer coincidir la extensión y ponerla en minúsculas con L
.
rename 's/.[^.]*$/L$&/' *.JPG *.MOV
Aquí no es necesario, pero si la expresión regular coincide con más de la parte que desea poner en minúsculas, puede colocar la parte que debe coincidir en un grupo:
rename 's/.([^.]*)$/.L$1/' *.JPG *.MOV
Reemplazar *.JPG *.MOV
por *.*
para actuar en todos los archivos sin importar la extensión. En bash ≥4.3 (y también en bash 4.0–4.2, con la advertencia de que esto también atraviesa enlaces simbólicos a directorios), puede actuar fácilmente sobre archivos en subdirectorios y así sucesivamente de forma recursiva:
rename 's/.[^.]*$/L$&/' **/*.*
Para los fanáticos de zsh (el :r
y :e
modificadores aíslan la extensión del resto del archivo):
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