按特定順序重新命名檔案

按特定順序重新命名檔案

我想要一個腳本來重命名文件(在其前面添加數字),具體取決於文件​​所在的資料夾。

所以我有以下場景:

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.map文件。如果新增此文件,資料夾內的編號將會不同。

知道如何以優雅的方式解決這個問題嗎?

先致謝

答案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

相關內容