Tengo algunos archivos como:
20150716_something-here
20150716_something-heretoo
20150716_something-hereaswell
Deben renombrarse como
2015-07-16_something-here
2015-07-16_something-heretoo
2015-07-16_something-hereaswell
Intenté usar unimplementación de perldelrename
dominio(vea mi comentario sobre la respuesta aceptada) pero no tuve éxito.
Respuesta1
Usando la expansión de subcadena incorporada de bash:
for f in 2015* ; do
mv "$f" "${f::4}-${f:4:2}-${f:6}"
done
Respuesta2
Con sed
:
LC_ALL=C sed -e 's/\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)/\1_\2_\3/' <file
Respuesta3
Si bien rename
es una herramienta muy poderosa, normalmente prefiero la simplicidad delmmv
Utilidad (múltiples movimientos):
mmv '????????_*' '#1#2#3#4-#5#6-#7#8_#9'
El ?
en el patrón de búsqueda representa un solo carácter, el *
una secuencia de caracteres arbitrariamente larga. En el patrón de reemplazo, cada #<number>
representa un correspondiente ?
o *
en el patrón de búsqueda. Además de ?
y *
, mmv
admite rangos de caracteres entre paréntesis (como [a-f]
).
( mmv
Probará si hay conflictos al cambiar el nombre antes de comenzar a funcionar, por lo que no corre el riesgo de perder archivos al sobrescribirlos).
Respuesta4
En mi distribución tengo el perl-rename
comando, que puede usar una expresión regular estilo Perl para cambiar el nombre de los archivos de forma masiva. El rename
comando solo acepta un par de cadenas fijas para cambiar el nombre.