Renomeie arquivos em ordem específica

Renomeie arquivos em ordem específica

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

informação relacionada