Eu gostaria de ter um script que renomeie os arquivos (adicione números na frente deles) dependendo da pasta em que estão.
Então eu tenho o seguinte cenário:
AAAMap
AABMap
AADMap
AAEMap
AAA.map
AAB.map
AAD.map
AAE.map
Lá temos 4 pastas e 4 arquivos de mapas. A primeira coisa a fazer é vincular simbolicamente cada arquivo a cada pasta e atribuir-lhes um número, dependendo da relação entre seu INDEX (crescente por nome) e o índice da pasta. Então ficaria assim:
AAAMap
'- 01_AAA.map
'- 02_AAB.map
'- 03_AAD.map
'- 04_AAE.map
AABMap
'- 01_AAB.map
'- 02_AAD.map
'- 03_AAE.map
'- 04_AAA.map
AADMap
'- 01_AAD.map
'- 02_AAE.map
'- 03_AAA.map
'- 04_AAB.map
AAEMap
'- 01_AAE.map
'- 02_AAA.map
'- 03_AAB.map
'- 04_AAE.map
Se eu executar novamente o script, ele deverá excluir todos os links simbólicos e criá-los completamente novos. (Exceto se você encontrar uma solução melhor apenas renomeando e reordenando os arquivos) -> porque pode haver arquivos adicionados (cada arquivo também terá sua própria pasta) que pode estar em qualquer posição do índice do arquivo (ordem alfabética).
Então, por exemplo, se simplesmente adicionarmosMapa AACMpasta eAAC.mapaarquivo. A numeração dentro das pastas seria diferente se este arquivo fosse adicionado.
Alguma ideia de como resolver isso de forma elegante?
desde já, obrigado
Responder1
# Cycle through the maps: First loop (auto-sorted) to count and prepare
NUM=0
for MAP in *.map ; do
ITEM=$(basename "$MAP" '.map')
# Ensure directory exists and is empty
DIR="${ITEM}Map"
mkdir -p "$DIR" || continue
rm "$DIR"/*.map 2>/dev/null
# Increase count
NUM=$(($NUM+1))
done
# Cycle through the maps: Second loop (auto-sorted) calculate number
OFFSET=0
for MAP in *.map ; do
ITEM=$(basename "$MAP" '.map')
# Cycle through the maps: Inner loop (auto-sorted) create links
IDX=0
for DIR in *.map ; do
DIR=$(basename "$DIR" '.map')"Map"
LNK=$(printf "%02d_$ITEM.map" $(((($OFFSET+$NUM+$IDX) % $NUM)+1)))
# Remove "echo" from next line after testing
echo ln -s "$MAP" "$DIR/$LNK"
IDX=$(($IDX-1))
done
OFFSET=$(($OFFSET+1))
done