我有编号文件(DSC_0001.jpg 到 DSC_0065.jpg),我知道如何使用 移动它们mv DSC_{0001..0065}.jpg dir
。
我不知道如何移动它们并改变值的范围。
mv DSC_{0001..0065}.jpg DSC_{0134..1198}.jpg
不管用。
还有其他方法可以做到这一点吗?
答案1
这是一个经过调试并得到很大改进的脚本,得益于 卡米尔·马乔罗夫斯基:
#!/bin/bash
for i in {0065..0001}; do
n="$(printf '%04d' "$((10#$i + 133))")"
mv DSC_$i.jpg DSC_$n.jpg
done
笔记:
- 我们正在倒数(
{0065..0001}
,而不是{0001..0065}
),因为数字即将增加。问题不会困扰你在这个特殊情况下,但想象一下你的范围是{0001..0150}
。向前处理,第一个将mv
是覆写文件编号0134
。在这种情况下,将编号较高的文件移开至关重要第一的,以防止数据丢失。当移动到另一个(空)目录(而不是仅在单个目录中重命名文件)时,问题不存在。 10#$i
在 shell 算术中强制以 10 为基数$i
;如果没有它,前导零将触发以 8 为基数,因此像0008
这样的数字会出现错误,这不是有效的八进制数。%04d
格式为 ,printf
负责在输出中前导零(例如,0134
而不仅仅是134
)。在这种特殊情况下n=0$((10#$i + 133))
也会起作用,只是因为我们$((…))
每次都会产生一个三位数。