Como renomear em lote arquivos usando o script bash?

0

Eu tenho vários arquivos em um diretório com o formato abaixo, então quero renomear todos como abaixo:

De

27_07_2017file1vc001vpxd-1605.log
27_07_2017case2vc001vpxd-9169.log
27_07_2017server3vc001vpxd-4640.log
27_07_2017file24vc001vpxd-9170.log
27_07_2017files5vc001vpxd-4641.log

Para

file1vc001vpxd-1605_27_07_2017_1.log
case2vc001vpxd-9169_27_07_2017_1.log
server3vc001vpxd-4640_27_07_2017_1.log
file24vc001vpxd-9170_27_07_2017_1.log
files5vc001vp-4641_27_07_2017_1.log

É necessário alterar o formato dos arquivos de datefilename.log para o formato filename.date_1.log

Por favor, não sugira usar o comando rename , já que ele não funciona no meu servidor linux.

Obrigado

    
por Nirmal 01.08.2017 / 06:31

2 respostas

2

Aqui está um script bash para isso ( revisado para o caso geral com base na pergunta revisada do OP):

for file in *.log; do 
    echo mv "$file" "${file:10:$((${#file}-14))}".${file::10}_1.log;
done

Acima da ${file:X:Y} é a sintaxe% de expansão bash ${variable:offset:length} e comprimento dos caracteres começam em deslocamento de seu variable (ou parâmetro) e renomeiam com mv comando. Basta remover o echo depois de garantir que o resultado é esperado como você deseja.

O resultado acima é o seguinte:

mv 27_07_2017case5.log case5.27_07_2017_1.log
mv 27_07_2017file1vc001vpxd-1605.log file1vc001vpxd-1605.27_07_2017_1.log
mv 27_07_2017file2vc001vpxd-9169.log file2vc001vpxd-9169.27_07_2017_1.log
mv 27_07_2017file3vc001vpxd-4640.log file3vc001vpxd-4640.27_07_2017_1.log
mv 27_07_2017file4vc001vpxd-9170.log file4vc001vpxd-9170.27_07_2017_1.log
mv 27_07_2017file5.log file5.27_07_2017_1.log
mv 27_07_2017file5vc001vpxd-4641.log file5vc001vpxd-4641.27_07_2017_1.log
mv 27_07_2017number-blahblahblah5.log number-blahblahblah5.27_07_2017_1.log
mv 27_07_2017number-blahblahblah5AAABBC.log number-blahblahblah5AAABBC.27_07_2017_1.log
mv 27_07_2017number5.log number5.27_07_2017_1.log
    
por 01.08.2017 / 08:02
0

Não conheço todos os casos possíveis para nomes de arquivos, então mostrarei uma abordagem geral que você pode adaptar às suas necessidades.

Você pode percorrer seus arquivos com um for loop ou usar find -exec como desejar. Eu acho que você principalmente quer saber como cortar seu nome de arquivo em pedaços e colocá-los juntos de forma diferente.

Você pode enviar o nome para uma ferramenta como sed e criar uma expressão regular para identificar as peças necessárias:

newname='echo "$oldname"|sed -E 's/([0-9-]{10})(.*).log/__1.log/''

Se você colocar () em torno dessas partes, poderá consultá-las como , e assim por diante na cadeia de substituição. Se você precisar adaptá-lo, leia a página man de sed ou pergunte aqui se você não tiver sucesso.

A outra possibilidade é usar a expansão da variável POSIX:

Você provavelmente sabe que

${oldname#*201?}

removerá o prefixo de data do seu nome de arquivo (o ? pode corresponder a qualquer caractere, então isso funciona para os anos de 2010 a 2019, se isso for suficiente. Caso contrário, adapte-se.)

Você também pode combiná-los:

${oldname%${oldname#*201?}}

Removerá a parte que extraímos acima, por isso você receberá apenas a data. Dessa forma, você pode separar as partes do nome do arquivo e colá-las em uma ordem diferente.

    
por 01.08.2017 / 07:59

Tags