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