从目录中的所有文件名中减去 1(重命名)。

Wes*_*Wes 19 command-line rename

我有一个目录,其中包含名称如下的图像文件

image1.jpg 
image2.jpg 
image3.jpg
...
Run Code Online (Sandbox Code Playgroud)

不幸的是,图像名称必须从零开始,所以image1.jpg应该是image0.jpgimage2.jpg应该是image1.jpg等等。

我可以写一个脚本来生成这样的MV命令,把它们放在一个shell脚本,然后执行他们-

mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...
Run Code Online (Sandbox Code Playgroud)

但我想在 Unix 中有一种更简洁的方法来做到这一点。那是什么?

小智 22

好的旧 perl 重命名:

rename 's/(\d+)(\.jpg)/($1-1).$2/e' *
Run Code Online (Sandbox Code Playgroud)

[评论]

图像编号应大于 0。

如果图像大于 9 并且没有前导 0,请使用$(ls -v1 *)以避免破坏。由@arielf 提出并被@Graeme 注意到。

如有疑问,也可-v用于详细和-n无操作。

  • 文件应按升序传递以避免任何破坏。仅当文件少于 10 个(或数字带​​有前导零)时,这才可以正常工作。 (6认同)
  • 'e' 表示评估,将评估替换部分。另见`perlreref` (3认同)
  • 用 `\`ls -v1 *\`` 替换末尾的 `*`,这样你就不会被破坏了。它将从最低数字到最高数字。 (2认同)

cha*_*aos 6

您可以将生成的mv命令通过管道传输到bash. 因此,您不必将它们复制到脚本中并执行该脚本。看:

command_that_generates_mv_commands | bash
Run Code Online (Sandbox Code Playgroud)

并且通过管道传输到的所有内容都将被执行bash


bab*_*bot 5

您可以迭代 ls 输出,这适用于您的示例:

i=0 
for file in $(ls *.jpg | sort) ; do 
     mv $file $(echo $file | sed 's/[0-9]*.jpg$/'${i}'.jpg/')
     i=$((++i))
done
Run Code Online (Sandbox Code Playgroud)

您必须在文件的同一路径上