폴더에 따라 파일 이름을 바꾸는 스크립트(앞에 숫자 추가)를 갖고 싶습니다.
그래서 다음과 같은 시나리오가 있습니다.
AAAMap
AABMap
AADMap
AAEMap
AAA.map
AAB.map
AAD.map
AAE.map
여기에는 4개의 폴더와 4개의 맵 파일이 있습니다. 가장 먼저 해야 할 일은 모든 파일을 모든 폴더에 심볼릭 링크하고 INDEX(이름순 오름차순)와 폴더 인덱스의 관계에 따라 번호를 지정하는 것입니다. 그러면 다음과 같이 보일 것입니다:
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