Dateien in einer bestimmten Reihenfolge umbenennen

Dateien in einer bestimmten Reihenfolge umbenennen

Ich hätte gerne ein Skript, das Dateien umbenennt (mit Zahlen davor), je nachdem, in welchem ​​Ordner sie sich befinden.

Ich habe also folgendes Szenario:

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

Wir haben also 4 Ordner und 4 Map-Dateien. Als erstes müssen wir jede Datei mit jedem Ordner symbolisch verknüpfen und ihnen eine Nummer zuweisen, je nachdem, in welcher Beziehung ihr INDEX (aufsteigend nach Name) zum Index des Ordners steht. Das würde dann so aussehen:

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

Wenn ich das Skript erneut ausführe, sollte es alle symbolischen Links löschen und sie komplett neu erstellen. (Außer Sie finden eine bessere Lösung, indem Sie die Dateien einfach umbenennen und neu anordnen) -> weil möglicherweise Dateien hinzugefügt wurden (jede Datei erhält auch ihren eigenen Ordner), die an jeder beliebigen Position des Dateiindex stehen können (alphabetische Reihenfolge).

Wenn wir zum Beispiel einfach hinzufügenAACMapOrdner undAAC.mapDatei. Die Nummerierung innerhalb der Ordner wäre anders, wenn diese Datei hinzugefügt würde.

Irgendeine Idee, wie man das auf elegante Weise lösen könnte?

Dank im Voraus

Antwort1

# 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

verwandte Informationen