특정 순서로 파일 이름 바꾸기

특정 순서로 파일 이름 바꾸기

폴더에 따라 파일 이름을 바꾸는 스크립트(앞에 숫자 추가)를 갖고 싶습니다.

그래서 다음과 같은 시나리오가 있습니다.

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

관련 정보