Renomeando vários arquivos; acrescentando

1

Estou procurando renomear vários arquivos com o mesmo nome, com exceção do final dos nomes dos arquivos. Eu quero substituir as partes diferentes com um contador incremental. Por exemplo. Com os seguintes arquivos,

71116_123    71116_134    71116_113    71116_023
71116_923    71116_103    71116_125    71116_223

Quero renomeá-los para

71116_1    71116_2    71116_3    71116_4
71116_5    71116_6    71116_7    71116_8

Eu encontrei uma pergunta semelhante aqui , mas a solução dada parece um pouco complicado! Existe uma solução mais simples?

    
por zzz2991 20.03.2015 / 20:53

1 resposta

1

Então, dadas as informações limitadas que você deu, deixe-me declarar minhas suposições que, se alguma estiver errada, me avise e eu / nós podemos ajustar a resposta. As suposições são críticas para manter a lógica curta e doce, caso contrário você desce para o modo 'overkill'.

Suposição 1. O 'sufixo' do seu arquivo é o que você quer mudar, e o 'sufixo' é o (s) número (s) após o sublinhado, significando que o sublinhado ("_") é o seu separador.

Suposição 2. Sempre haverá exatamente um sublinhado no nome do arquivo original - não dois ou mais sublinhados, e nenhum sem sublinhados

Suposição 3. Você quer o 'prefixo', que é o valor antes que o separador (como definido na Suposição 1) permaneça exatamente o mesmo.

Suposição 4. Independentemente do sufixo original, você deseja que o novo sufixo use o mesmo separador (conforme definido na Suposição 1) e que o novo sufixo seja incrementado não pelo registro de data e hora ou por qualquer outro valor que não seja a ordem de classificação foi antes de renomear (o que significa, orientado pela ordem de classificação alfanumérica original dos nomes dos arquivos).

Suposição 5. Você quer que seja razoavelmente 'simples', o que é, infelizmente, completamente arbitrário, mas eu o definirei como 'sem loops complicados ou loops while' e 'não muitos comandos estranhos com sed ou awk'.

Portanto, não é um problema difícil, mas dadas as restrições listadas, ele se torna um desafio interessante. Independentemente disso, eu ainda recorria a usar um 'simples' para loop e um 'simples' awk:

cnt=0
for i in *; do
  let cnt=cnt+1
  mv "$i" "$(echo "${i}_${cnt}" | awk -F_ '{print $1"_"$3}')"
done

Se houver outros arquivos no mesmo diretório que você não deseja renomear, como foi o caso do meu teste original (eu estava testando no diretório /tmp , que tinha outros arquivos que eu não queria renomear), então filtre com alguma parte do prefixo, assim:

cnt=0
for i in 71116*; do
  let cnt=cnt+1
  mv "$i" "$(echo "${i}_${cnt}" | awk -F_ '{print $1"_"$3}')"
done

Eu olhei as respostas no seu link - e eu concordo que são exageradas, assim como muitas das respostas no stackexchange. No entanto, a maioria das respostas "exageradas" se baseiam em menos suposições, então, em teoria, elas são mais "versáteis" e / ou mais "portáveis" do que o que ofereço aqui.

    
por 20.03.2015 / 21:37

Tags