Cambiar el nombre de los últimos 8 caracteres del nombre del archivo

Cambiar el nombre de los últimos 8 caracteres del nombre del archivo

Recibo archivos de video con nombres diferentes, pero los últimos 8 caracteres de todos son números (también diferentes cada vez). Este es el patrón del nombre del archivo:

custom text 00030402.avi

Tengo que hacer que el nombre del archivo se vea así:

00\:03\:04\:02

Entonces mi pregunta es cómo cambiar el nombre de los últimos 8 caracteres y conservarlos para lograr este patrón.

Respuesta1

Usando rename(el de perla veces llamado prename, no de util-linux):

rename 's/(\d{2})(\d{2})(\d{2})(\d{2})/$1:$2:$3:$4/'  *.avi

Esto cambiaría el nombre de un archivo custom text 00030402.avicomo custom text 00:03:04:02.avi.

Si usa barras invertidas en el nombre del archivo (antes de :), diga:

rename 's/(\d{2})(\d{2})(\d{2})(\d{2})/$1\\:$2\\:$3\\:$4/' *.avi

Para eliminar el texto personalizado de los nombres de archivos, diga:

rename 's/.* (\d{2})(\d{2})(\d{2})(\d{2})(.*)/$1\\:$2\\:$3\\:$4$5/' *.avi

Respuesta2

Con zsh:

$ autoload zmv
$ zmv -v '(*)(??)(??)(??).avi' '$1\:$2\:$3\:$4.avi'
mv -- custom\ text\ 00030402.avi custom\ text\ 00\\:03\\:04\\:02.avi

(-v para detallado). Para eliminar eltexto personalizado:

$ zmv -v '*(??)(??)(??)(??).avi' '$1\:$2\:$3\:$4.avi'
mv -- custom\ text\ 00030402.avi 00\\:03\\:04\\:02.avi

Respuesta3

Aquí hay una manera de hacerlo con la búsqueda anticipada de expresiones regulares de Perl:

perl -e '
    while($name=shift){
        @components = split /(?=(?:[0-9]{2})+[^0-9]+$)/,$name;
        shift @components;
        $new_name = join '\:',@components;
        rename $name => $new_name;
    }
' list_of_avi_files

Esto funcionará para cualquier número de pares de dígitos, no solo 4. También puede cambiar {2}a {3}, por ejemplo, y dividirlo en triples de dígitos.

información relacionada