Renomeie vários arquivos usando scripts Bash

Renomeie vários arquivos usando scripts Bash

Quero renomear vários arquivos no mesmo diretório usando scripts Bash. Os nomes dos arquivos são os seguintes:

file2602201409853.p
file0901201437404.p  
file0901201438761.p  
file1003201410069.p  
file2602201410180.p

Quero renomear para o seguinte formato:

file2503201409853.p
file2503201437404.p  
file2503201438761.p  
file2503201410069.p  
file2503201410180.p

Estava lendo sobre o comando rename, e tento fazer desta forma, mas não faz nada, acho que tenho dúvidas sobre a sintaxe. Então eu li que você pode fazer um loop usando omvcomando da seguinte forma:

for file in cmpsms*2014*.p; do
    mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}"
done

Mas não consigo renomear os arquivos. O que estou fazendo de errado?

Responder1

Você estava certo em considerar renomear primeiro. A sintaxe é um pouco estranha se você não está acostumado com expressões regulares, mas é de longe o caminho mais rápido/curto quando você sabe o que está fazendo:

rename 's/\d{4}/2503/' file*

Isso simplesmente corresponde aos primeiros 4 números e os troca pelos que você especificou.

E um equipamento de teste ( -vnsignifica ser detalhado, mas nãofazerqualquer coisa) usando seus nomes de arquivos:

$ rename 's/\d{4}/2503/' file* -vn
file0901201437404.p renamed as file2503201437404.p
file0901201438761.p renamed as file2503201438761.p
file1003201410069.p renamed as file2503201410069.p
file2602201409853.p renamed as file2503201409853.p
file2602201410180.p renamed as file2503201410180.p

Responder2

Isso deve funcionar:

for f in file*; do mv $f ${f/${f:4:8}/25032014}; done

Ele substitui a string entre o 4º e o 12º caractere por "25032014".

Responder3

esta é realmente a resposta de @Eric acima - mas é uma resposta elegante, então estou republicando-a como uma resposta adequada para chamar mais atenção para ela.

for f in *Huge*; do mv "$f" "${f/Huge/Monstrous}"; done

Responder4

Uma maneira nativa simples de fazer isso sem loop, compassagem de diretório:

find -type f | xargs -I {} mv {} {}.txt

Ele renomeará todos os arquivos existentes.

E abaixo um exemplo de trabalho comparalelização:

find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:4}2503${f:8}'

informação relacionada