特定の順序でファイルの名前を変更する

特定の順序でファイルの名前を変更する

ファイルがどのフォルダにあるかに応じて、ファイル名を変更する(先頭に数字を追加する)スクリプトが必要です。

そこで次のようなシナリオを考えます。

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.マップファイル。このファイルが追加されると、フォルダー内の番号付けが異なります。

これをエレガントな方法で解決する方法をご存知ですか?

前もって感謝します

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

関連情報