Мне бы хотелось иметь скрипт, который переименовывает файлы (добавляя перед ними цифры) в зависимости от того, в какой папке они находятся.
Итак, у меня следующий сценарий:
AAAMap
AABMap
AADMap
AAEMap
AAA.map
AAB.map
AAD.map
AAE.map
Там у нас есть 4 папки и 4 файла карт. Первое, что нужно сделать, это создать символическую ссылку на каждый файл в каждой папке и присвоить им номер, в зависимости от того, как их ИНДЕКС (по возрастанию имени) относится к индексу папки. Так что это будет выглядеть так:
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
Если я перезапущу скрипт, он должен удалить все символические ссылки и создать их совершенно новыми. (За исключением случая, если вы найдете лучшее решение, просто переименовав и изменив порядок файлов) -> потому что могут быть добавлены файлы (каждый файл также получит свою собственную папку), которые могут находиться в любой позиции файлового индекса (в алфавитном порядке).
Так, например, если мы просто добавимAACКартапапка иAAC.картафайл. Нумерация внутри папок будет иной, если этот файл будет добавлен.
Есть идеи, как решить эту проблему элегантным способом?
заранее спасибо
решение1
# 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