Renomeie os últimos 8 caracteres do nome do arquivo

Renomeie os últimos 8 caracteres do nome do arquivo

Estou recebendo arquivos de vídeo com nomes diferentes, mas os 8 caracteres finais de todos são números (também diferentes a cada vez). Este é o padrão do nome do arquivo:

custom text 00030402.avi

Eu tenho que fazer com que o nome do arquivo fique assim:

00\:03\:04\:02

Então minha dúvida é como renomear os últimos 8 caracteres e preservá-los para atingir esse padrão.

Responder1

Usando rename(aquele de perlàs vezes chamado prename, não de util-linux):

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

Isso renomearia um nome de arquivo custom text 00030402.avicomo custom text 00:03:04:02.avi.

Se você colocar barras invertidas no nome do arquivo (antes de :), diga:

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

Para remover o texto personalizado dos nomes dos arquivos, diga:

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

Responder2

Com 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 detalhado). Para remover otexto personalizado:

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

Responder3

Aqui está uma maneira de fazer isso com o lookahead de regex 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

Isso funcionará para qualquer número de pares de dígitos, não apenas 4. Você também pode mudar {2}para {3}, por exemplo, e dividi-lo em triplos de dígitos.

informação relacionada