在bash中重命名文件并在文件名后添加数字

9

我有很多这样的文件:

13831_1.jpg
13838_1.jpg
138035_1.jpg
138037_1.jpg
138039_1.jpg

我需要将文件名上的数字增加5000000。 结果应该如下所示:
5013831_1.jpg
5013838_1.jpg
5138035_1.jpg
5138037_1.jpg
5138039_1.jpg

有没有用bash或perl的方法可以实现这个功能?
3个回答

9

操作步骤:执行命令rename -v。如果输出以下内容:

Usage: rename [-v] [-n] [-f] perlexpr [filenames]

这个检查是因为至少有两种不同的重命名工具,功能非常不同。而我需要的解决方案需要处理perlexpr的重命名。

接下来你可以:

rename 's/^(\d+)/5000000+$1/e' *.jpg

我想尝试一下这个(因为听起来很棒),但是在cygwin中似乎没有rename。你知道我该如何获取它吗? - Svend Hansen
2
@SvendHansen,这实际上是一个perl脚本 - doubleDown
我在互联网上进行了搜索,似乎它在cygwin上不可用。安装util-linux包将为您提供一个rename命令,但它更像是mv,似乎不支持正则表达式(或者如果支持,格式不同)。然而,有一些第三方/自编写的脚本可以提供这个功能(比如这个:http://nylinuxhelp.com/blogs/command-line/cygwin-rename-command-help)。 - Svend Hansen
1
获取脚本- 它在doubleDown评论中链接。 - user80168

6

使用bash的一种方法是这样做:

for file in *.jpg; do
  number=${file%_*}
  therest=${file#$number}
  mv "$file" "$((number+5000000))$therest"
done

注意:

  • *.jpg 将扩展为当前目录下的 .jpg 文件列表(参考:文件名扩展)。
  • ${file%_*} 删除文件名中 _ 之后的所有内容并返回它(参考:Shell 参数扩展)。
  • ${file#$number} 从文件名开头删除变量 number 的内容并返回它(参考:Shell 参数扩展)。
  • $((number+5000000)) 计算括号内的算术表达式并返回结果(参考:算术扩展)。

-3
$filename      = "13831_1.jpg";
$org           = explode("_".$filename);
$addnumber     = 5000000+$org[0];
$string        = implode("_",$addnumber);

1
这是什么编程语言?它绝对不是Bash。 - user80168

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接