移动一系列编号文件并更改其值

移动一系列编号文件并更改其值

我有编号文件(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))也会起作用,只是因为我们$((…))每次都会产生一个三位数。

相关内容