Переименовать файлы в определенном порядке

Переименовать файлы в определенном порядке

Мне бы хотелось иметь скрипт, который переименовывает файлы (добавляя перед ними цифры) в зависимости от того, в какой папке они находятся.

Итак, у меня следующий сценарий:

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

Связанный контент