Renomeia múltiplos arquivos usando Bash scripting

27

Eu 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

Eu quero renomear para o seguinte formato:

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

Eu estava lendo sobre o comando rename, e tente 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 o comando mv 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 errado?

    
por franvergara66 26.03.2014 / 15:03

6 respostas

41

Você estava certo em considerar renomear primeiro. A sintaxe é um pouco estranha se você não estiver acostumado a regexes, mas é de longe a rota mais rápida / mais curta quando você sabe o que está fazendo:

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

Isso simplesmente combina os primeiros 4 números e os troca para os que você especificou.

E um equipamento de teste ( -vn significa ser detalhado, mas não faz nada) 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
    
por 26.03.2014 / 17:45
25

Isso deve funcionar:

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

Substitui a string entre o 4º e o 12º caractere com "25032014".

    
por 26.03.2014 / 15:42
9

esta é realmente a resposta do @ Eric de cima - mas é uma resposta elegante, então estou repostando-a como uma resposta apropriada para chamar mais atenção a ela.

for f in *Huge*; do mv $f ${f/Huge/Monstrous}; done
    
por 25.11.2015 / 16:22
1
ptrn='file[0-9][0-9][0-9][0-9]2014[0-9][0-9][0-9][0-9][0-9].p'
path=/dir
( set -- "${path}/"${ptrn} ; for f ; do {
    echo "mv ${path}/${f} \
        ${path}/file25032014${f#2014}" 
} ; done )

Isso deve fazer o truque. Nota - Não tenho o hábito de entregar comandos mv em massa - como está escrito, é apenas um eco. Você terá que resolver isso antes que funcione.

    
por 26.03.2014 / 15:46
1

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

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

Ele renomeia todos os arquivos no lugar.

E abaixo de um exemplo de trabalho com paralelização :

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

Se você acha que faz muito esse tipo de coisa, procure por "rename.pl". É um script perl, mas permite que você simplesmente o insira em código perl (como uma expressão s ///), e ele fará uma renomeação em massa com base nessa expressão ou código.

Há uma versão básica aqui: link , mas há outras versões flutuando na rede. Tem sido em torno de idades e idades e idades.

    
por 26.03.2014 / 18:07

Tags