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 perl
a 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.avi
como 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.