![按特定顺序重命名文件](https://linux22.com/image/1605028/%E6%8C%89%E7%89%B9%E5%AE%9A%E9%A1%BA%E5%BA%8F%E9%87%8D%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6.png)
我想要一个脚本,根据文件所在的文件夹重命名文件(在前面添加数字)。
所以我有以下场景:
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