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