Renomeia todos os arquivos em subdiretórios

2

Estou com um problema ao escrever um script para a renomeação em massa de arquivos em subdiretórios.

Eu tenho uma pasta com várias subpastas e essas subpastas têm vários arquivos que eu preciso renomear.

Este é o lugar onde cheguei até agora:

for file in $(find -name "*.report")
do
  mv "$file" "LPP_${file/LP_/}"
done

Então, como você pode ver, eu preciso substituir a string 'LP_' no nome do arquivo pelo 'LPP _'.

Isso não está funcionando por causa do caminho para o arquivo - as strings recuperadas do comando find são apenas nomes de arquivos e não incluem o caminho. Para incluir o caminho, estou tentando algo assim:

for file in $(find -name "*.report")
do
  echo "$file" 
  echo "${RELPATH/\$\//}/${file/LP_/LPP_}"
done

Mas a variável RELPATH é prefixada com um caractere '/', então o comando mv está reclamando que não pode mover o arquivo para /./ subpasta1 / LPP_filename.report

Alguém pode me dizer o que estou fazendo errado, existe uma maneira melhor de fazê-lo e explicar por que existe um caractere '/' extra na variável RELPATH e como removê-lo?

Obrigado a todos antecipadamente!

    
por sskular 14.11.2014 / 20:16

1 resposta

2

Eu realmente não entendo o seu problema ( find deve retornar o caminho completo), no entanto, sugiro uma abordagem diferente, talvez algo como

find -name '*.report' -execdir bash -c 'echo mv "$0" "${0/LP_/LPP_}"' {} \;

Ao passar o find result {} como um parâmetro posicional de shell $0 para um comando subordinado bash -c , podemos contornar o fato de que não podemos fazer mv {} ${{}/LP_/LPP_} diretamente. O uso de -execdir em vez do mais comum -exec garante que a substituição ocorra apenas na parte do nome do arquivo, caso algum dos caminhos contenha a string LP_

O echo é apenas para que você possa testá-lo e verificar se a renomeação parece correta - você precisará removê-lo para permitir renomeação real.

    
por steeldriver 14.11.2014 / 20:32