
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 ( -vn
significa 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}'