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


17

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

image1.jpg 
image2.jpg 
image3.jpg
...

不幸的是,图像名称必须基于零,所以image1.jpg应该是image0.jpgimage2.jpg应该是image1.jpg,依此类推。

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

mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...

但是我想在Unix中有一种更整洁的方法。那是什么


6
只要没有差距,那实际上就是最简单的方法。(for i in $(seq 0 100); do mv image$[i+1].jpg image$i.jpg; done
Ricky Beam

5
图像的顺序重要吗?如果没有,只是重命名在最后的影像imageN.jpgimage0.jpg和你做。
jnovacho 2014年

@jnovacho,非常聪明!但是,是的,图像的顺序很重要。
2014年

Answers:


20

好旧的perl重命名:

rename 's/(\d+)(\.jpg)/($1-1).$2/e' *

[备注]

图片编号应大于0。

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

如有疑问,还可以-v用于冗长和-n不采取任何措施。


“ e”表示什么?
2014年

3
“ e”表示评估,将评估替换部分。另请参阅perlreref

6
文件应以升序传递,以免造成混乱。仅当文件少于10个(或数字的前导零)时,此方法才能正常工作。
Graeme 2014年

我已经注意到了这一点,0消息来源中也一定没有。

2
最后将替换为*`ls -v1 *`您会更安全。从最低的数字到最高的数字。
arielf 2014年

6

您可以将生成的mv命令传递给bash。因此,您不必将其复制到脚本中并执行该脚本。看到:

command_that_generates_mv_commands | bash

并且将执行所有通过管道传递给的操作bash


那不是整洁的。:)虽然可以解决问题,所以+1。
JMCF125

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

您必须位于文件的相同路径上


1
最好与结合使用-i-n与结合使用mv,它将防止在极端情况下被覆盖。
Graeme

会不会sort -V更好呢?
user80551 2014年

sort将无法使用,它将显示image10.jpgimage1.jpg此之前可能是一个问题。您需要sort -nk 1.8像@Graeme的答案一样。
terdon

@ user80551 sort -V是个好主意,请将其添加到我的答案中。但是,可能还有其他极端情况,只是一般的好建议是添加类似的选项,以防有人复制并最终造成一些损害。
Graeme 2014年

4

以下内容似乎适用于任何适合此模式的内容imageNUMBER.jpg。我已经echomv命令之前放置了它,以首先显示该命令将执行的操作。要真正执行重命名,只需删除echo

for i in `ls image*.jpg|sort -V` ; do 
    x=`echo $i|sed -e "s/image\(.*\).jpg/\1/"`
    y=$(( $x - 1 ))
    echo mv -i $i image$y.jpg
done

在第一行中,ls image*.jpg|sort -V将会导致JPG文件在文件名中以升序列出。该x=行从文件名中提取数字。y=然后,该行将数字减一。y然后在mv命令中使用输入的文件名和编号,该-i标志将在覆盖文件之前通知您。

对于我自己的小型测试,这产生了输出:

mv -i image1.jpg image0.jpg
mv -i image2.jpg image1.jpg
mv -i image123.jpg image122.jpg

就个人而言,我建议重命名为另一个不同的文件名,因为现在处理文件的顺序可以有很大的不同。


1
最好与结合使用-i-n与结合使用mv,它将防止在极端情况下被覆盖。
Graeme 2014年

很好的建议,我将编辑答案
brm 2014年

在macOS中,您应该使用sort -n,该-V选项不存在。
Vincent Sit 2016年

4

使用该perl脚本prename(在基于Debian的发行版上进行符号链接重命名)也需要GNU find/ sort。文件以升序排列,以防止覆盖。

find . -regex '\./image[0-9]+\.jpg' -print0 | sort -zV |
  xargs -0 rename -n 's/(\d+)\.jpg$/@{[$1-1]}.jpg/'

-n确定您要执行的操作后,将其删除。在这样做之前会警告已经存在的文件。但是,只要它显示文件以升序重命名,则在实际运行时不会有冲突。


文件已经存在与此问题。
2014年

4

zsh

autoload zmv # (in ~/.zshrc)
zmv -Qf -n 'image(<->).jpg(n)' 'image$(($1-1)).jpg'

-n高兴时删除)。

(n)是对列表进行数字排序,因此image9.jpg之前已重命名image10.jpg

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.