我想要一個腳本來重命名文件(在其前面添加數字),具體取決於文件所在的資料夾。
所以我有以下場景:
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