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
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.
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?
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
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