按特定顺序重命名文件

按特定顺序重命名文件

我想要一个脚本,根据文件所在的文件夹重命名文件(在前面添加数字)。

所以我有以下场景:

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地图文件。如果添加此文件,文件夹内的编号将会有所不同。

有什么想法可以优雅地解决这个问题吗?

提前致谢

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

相关内容