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