Cambiar el nombre de los archivos en un orden específico

Cambiar el nombre de los archivos en un orden específico

Me gustaría tener una secuencia de comandos que cambie el nombre de los archivos (agregue números delante) dependiendo de en qué carpeta se encuentren.

Entonces tengo el siguiente escenario:

AAAMap
AABMap
AADMap
AAEMap
AAA.map
AAB.map
AAD.map
AAE.map

Allí tenemos 4 carpetas y 4 archivos de mapas. Lo primero que debe hacer es vincular simbólicamente cada archivo a cada carpeta y darles un número, dependiendo de la relación que tenga su ÍNDICE (ascendente por nombre) con el índice de la carpeta. Entonces quedaría así:

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

Si vuelvo a ejecutar el script, debería eliminar todos los enlaces simbólicos y crearlos completamente nuevos. (Excepto si encuentra una mejor solución simplemente cambiando el nombre y reordenando los archivos) -> porque se podrían agregar archivos (cada archivo también tendrá su propia carpeta) que pueden estar en cualquier posición del índice de archivos (orden alfabético).

Así, por ejemplo, si simplemente sumamosAACMapacarpeta yAAC.mapaarchivo. La numeración dentro de las carpetas sería diferente si se agregara este archivo.

¿Alguna idea de cómo solucionar esto de forma elegante?

gracias de antemano

Respuesta1

# 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

información relacionada