Quero renomear vários arquivos no mesmo diretório usando o script 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
Eu estava lendo sobre o comando renomear e tente fazer dessa maneira, mas não faz nada, acho que tenho dúvidas sobre a sintaxe. Então eu li que você pode fazer um loop usando o comando mv da seguinte maneira:
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 errado?
*
está?Respostas:
Você estava certo ao considerar renomear primeiro. A sintaxe é um pouco estranha se você não está acostumado a expressões regulares, mas é de longe a rota mais rápida / mais curta depois de saber o que está fazendo:
Isso simplesmente corresponde aos 4 primeiros números e os troca pelos que você especificou.
E um equipamento de teste (
-vn
significa ser detalhado, mas não faça nada) usando seus nomes de arquivo:fonte
rename
existe uma ferramenta de renomeação de arquivos completamente diferente (que o Debian envia comorename.ul
).rename
como o debian.Isso deve fazer o truque:
Ele substitui a sequência entre o 4º e o 12º caractere por "25032014".
fonte
for f in file*; do mv $f ${f/${f:4:4}/2503}; done
também funciona.for f in *Huge*; do mv $f ${f/Huge/Monstrous}; done
Esta é realmente a resposta de Eric de cima - mas é uma resposta elegante, por isso estou publicando-a como uma resposta adequada para chamar mais atenção.
fonte
Isso deve fazer o truque. Nota - eu não tenho o hábito de entregar comandos mass mv - como está escrito, é apenas um eco. Você terá que resolver isso antes que funcione.
fonte
Uma maneira nativa simples de fazer isso sem fazer loop, com travessia de diretório :
Ele renomeará todos os arquivos no local.
E abaixo um exemplo de trabalho com paralelização :
fonte
find -type f -name "file*.p" | parallel 'ext="{}" ; mv -- {} ${ext:0:4}2503${ext:8}'
Se você acha que faz muito esse tipo de coisa, procure "rename.pl". É um script perl, mas permite simplesmente alimentá-lo com código perl (como expressão ///) e fará uma renomeação em massa com base nessa expressão ou código.
Há uma versão básica aqui: http://stackoverflow.org/wiki/Rename.pl, mas há outras versões flutuando pela rede. Tem sido em torno de idades e idades e idades.
fonte