sed renomear arquivos movendo números para o final do arquivo

0

Eu tenho um diretório que contém vários arquivos com o seguinte padrão.

BORBOLETA 1953-MADAMA

1953-MADAMA BUTTERFLY_001

Estou tentando renomeá-los para alcançar o seguinte:

BORBOLETA MADAMA [1953]

MADAMA BUTTERFLY_001 [1953]

Isso significaria remover o "-" e incluir o ano entre colchetes quadrados. Como há mais números do que o ano, acho que o comando deve corresponder apenas a números com quatro dígitos.

Eu li a documentação do sed e não encontrei nenhuma solução para o meu problema. É possível alcançar meu objetivo com sed ?. Desde já, obrigado.

    
por sms 06.04.2014 / 15:47

3 respostas

0

Você pode fazer isso no bash puro:

for f in [0-9][0-9][0-9][0-9]-*; do
  mv "$f" "${f:5}[${f:0:4}]"
done
    
por 06.04.2014 / 21:42
0

Para renomear todos os arquivos em um diretório, use

ls -1|sed -r 's/^([0-9]{4})(-)(.*)$/mv "&" "[]"/g'|sh

testado com GNU sed version 4.2.1

    
por 06.04.2014 / 16:41
0

Usando expressões regulares estendidas ( -r ):

sed -rn -e 's/^([0-9]{4})-(.*)$/[]/p' /tmp/input_file

Ou o mesmo sem expressões regulares estendidas (adicionadas algumas barras invertidas):

sed -n -e 's/^\([0-9]\{4\}\)-\(.*\)$/[]/p' /tmp/input_file

Em ambos os casos, o mais importante é corresponder a qualquer dígito ( [0-9] ) exatamente 4 vezes {4} . Queremos garantir que não haja nada antes desses dígitos, por isso use ^ , que é o começo de uma linha e nada depois deles, é por isso que adicionamos - . Você pode alterar - para algo como [^0-9] , o que significa qualquer coisa, menos um dígito, se for possível que haja um caractere diferente de - ou apenas descarte isso se os dígitos também forem aceitáveis.

Você também pode usar ? , se necessário, fazendo, por exemplo, o primeiro grupo de dígitos opcional e apenas imprimindo o nome do arquivo sem nenhuma alteração se não houver correspondência.

    
por 06.04.2014 / 16:44

Tags