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