重命名文件,其编号从特定编号开始

时间:2019-09-09 20:29:53

标签: bash macos

我有一些文件:

$ ls
00000.ABC
00001.ABC
00002.ABC
00003.ABC
00004.ABC
00005.ABC

我想将它们更改为以某个数字开头,例如00055.ABC,以便新文件看起来像:

$ ls
00055.ABC
00056.ABC
00057.ABC
00058.ABC
00059.ABC
00060.ABC

我了解for循环遍历每个文件,例如for file in ls { },但是我不确定以某个数字开头的递增数字,因此不胜感激。

2 个答案:

答案 0 :(得分:1)

这应该有效:

for f in *.ABC; do
   num=$(basename "$f" .ABC)
   num2=$(printf "%05d" $((num + 55)))
   echo mv "$f" "$num2.ABC"
done

注意:

  • 我假设您的文件都遵循数字模式,后跟.ABC,以便basename $f .ABC提取数字。如果此假设不成立,则必须调整num=行。

  • $(( ... ))是进行算术运算的bash语法。

  • (printf "%05d" ...)在这里在数字前面填充零,否则您将得到55等。

  • 一旦确信自己做对了,请删除echo

  • 编辑警告:新的文件名集不应与旧的文件名集重叠,否则您可能会丢失一些文件。仔细选择mv命令的运行顺序可以解决此问题,但是在文件重命名时将其放置在新目录中,然后再将其移回将更简单。

编辑

@MarkSetchell在注释中指出,您想要不基于原始文件名的顺序编号,在这种情况下,此循环将起作用:

i=55 # choose your starting destination file number here
for f in *.ABC; do
   dest=$(printf "%05d" $i).ABC
   echo mv "$f" "$dest"
   i=$((i + 1))
done

答案 1 :(得分:1)

您可以使用rename轻松地做到这一点,它实际上只是一个Perl脚本,可以通过 homebrew 使用 macOS 安装: >

brew install rename

该命令将是:

rename --dry-run  -XN "00055" -e '$_ = $N' *ABC

示例输出

'00001.ABC' would be renamed to '00055.ABC'
'00002.ABC' would be renamed to '00056.ABC'
'00003.ABC' would be renamed to '00057.ABC'
'00004.ABC' would be renamed to '00058.ABC'
'00005.ABC' would be renamed to '00059.ABC'

如果看起来正确,则可以删除--dry-run,然后再次执行。使用rename的好处是它不会破坏(覆盖)文件,并且如果您使用--dry-run选项,它将告诉您它将要做什么,而无需实际更改任何内容。它也非常强大-可以执行小写,驼峰,大写,删除控制字符,调用任何Perl模块并计算您可以想到的任何表达式或替换。