Como renomear arquivos em lote usando a combinação de loops no bash?

0

Eu tenho 2 estruturas de pastas assim:

SOURCE_FOLDER_W_GOOD_NAMES
├── A_some_name.png
├── B_another_different_name.png
├── C_just_another_too.png
└── D_this_one_stop_this_example.png

Outra pasta:

DESTINATION_FOLDER_W_INCREMENT_NAMES
├── icon_0.icns
├── icon_1.icns
├── icon_2.icns
└── icon_3.icns

Então, basicamente, SOURCE_FOLDER já contém os arquivos que são classificados em ordem alfabética. Esta ordem de classificação já é correspondida com DESTINATION_FOLDER (ex .: A_some_name.png === icon_0.icns )

Estou usando essa combinação de loops para renomear os arquivos:

i=0
j=0
for img in SOURCE_FOLDER/*.png; do
  for i in {0..10000}; do
    let j++ || true;
    mv "SOURCE_FOLDER/icon_$i.icns" "DESTINATION_FOLDER/${img%.*}.icns"
  done
done

Eu executei isso na linha de comando (o acima é formatado, sou um cara de uma linha) na raiz da pasta acima.

THE_FATHER_FOLDER
├── SOURCE_FOLDER_W_GOOD_NAMES
└── DESTINATION_FOLDER_W_INCREMENT_NAMES

Infelizmente, o loop acima não está funcionando como eu esperava. Tenho certeza de que estou errado, mas não sei onde.

Por favor corrija-me.

ATUALIZADO

Solução para a pergunta acima, resolvi sozinho

counter=0
for img in SOURCE_FOLDER/*.png; do
  let counter++ || true;
  mv "SOURCE_FOLDER/icon_$counter.icns" "DESTINATION_FOLDER/${img%.*}.icns"
done

Mas tenho outra pergunta nesta pasta:

DESTINATION_FOLDER_W_INCREMENT_NAMES
├── icon_0.icns
├── icon_1.icns
├── icon_2.icns
└── icon_3.icns

Eu quero reindexá-lo de 1 em vez de 0 , portanto estou usando isso:

counter=0
for index in {0..final_number}; do
  let counter++ || true;
  mv "icon_${index}.icns" "icon_${counter}.icns";
done

No momento, meus arquivos são iniciados a partir de 0 e terminados em final_number - 1 , portanto, sobrescreverá todos os arquivos que possuo nesta pasta e obteve apenas o primeiro arquivo (icon_0) que foi renomeado para (icon_final_number) quando terminar.

Como eu poderia resolver isso?

    
por Toan Nguyen 10.05.2016 / 08:51

3 respostas

3

Você quer renomear para trás :

counter=$((final_number + 1))
for index in {final_number..0}; do
  mv "icon_${index}.icns" "icon_${counter}.icns";
  let counter--;
done
    
por 10.05.2016 / 14:19
1

Seus problemas serão resolvidos pelo seguinte código:

#!/bin/sh

i=0
for img in 'ls SOURCE_FOLDER_W_GOOD_NAMES/*.png'; do
        mv $img DESTINATION_FOLDER_W_INCREMENT_NAMES/icon_$i.icns
        i=$((i+1));
done
    
por 10.05.2016 / 09:10
0

Inicialize seu contador com o valor 1 em vez de 0 e aumentá-lo depois que um movimento é feito. Então você não precisará executar um script bash secundário apenas para renomear os arquivos, você o endereçaria no script original.

Além disso, quando você aumenta seu contador, adiciona "|| true"? não tem significado. Experimente este código

counter=1
for img in SOURCE_FOLDER/*.png; do
  mv "SOURCE_FOLDER/icon_$counter.icns" "DESTINATION_FOLDER/${img%.*}.icns"
  let counter++
done
    
por 10.05.2016 / 10:10

Tags