重命名多个顺序编号的文件并使用BASH更改编号格式?

时间:2010-09-23 02:42:53

标签: image bash rename batch-processing

我有一堆按此格式命名的文件:imageXXX.jpg。所以它就像image001.jpg一样。我只想保留数字的一部分,并摆脱前面的0。因此,该文件将被命名为1.jpg。我怎么能用Bash实现这个目标?

2 个答案:

答案 0 :(得分:3)

Pure Bash:

shopt -s extglob
for f in image*.jpg; do mv "$f" "${f/#image*(0)}"; done

其他代码可以检查名称冲突或处理其他错误情况。您可以使用mv -i在文件被覆盖之前进行提示。

答案 1 :(得分:2)

在Linux上,值得尊敬的Perl实用程序rename是友好的:

$ rename 's/^image0+//' image*.jpg

你应该知道,剥离前导零将破坏排序顺序,即*.jpg命令,如:

1.jpg
10.jpg
11.jpg
...
2.jpg
20.jpg

如果您想保留订单,请使用

$ rename 's/^image//' image*.jpg

代替。

是为响应系统识别而添加的

您可以单独使用bash编写脚本,但这非常简单,故障情况确实需要正确处理。是的,将Perl悬挂在一个系统上也是非常重要的,但它很容易并且已经发明了轮子

  

Fedora Core 8 Perl RPM:http://rpm.pbone.net/index.php3/stat/4/idpl/5152898/dir/fedora_8/com/perl-5.8.8-30.n0i.51.fc8.i386.rpm.html
  CPAN重命名:http://metacpan.org/pod/File::Rename

添加以响应静默失败

rename这样的chmod如果你给出错误的参数会抱怨,但如果你要求的那些都没有效果,两者都会保持沉默。例如

$ ls -l junk
-rw-r--r-- 1 msw msw 0 2010-09-24 01:59 junk
$ chmod 688 junk
chmod: invalid mode: '688'
$ chmod 644 junk    # was already 644 mode, nothing happened no error
$ rename 's/bob/alice/' ju*k    
# there was no 'bob' in 'junk' to substitute, no change, no error
$ ls -l junk
-rw-r--r-- 1 msw msw 0 2010-09-24 01:59 junk
$ rename 's/un/ac/' j*k  # but there is an 'un' in 'junk', change it
$ ls -l j*k
-rw-r--r-- 1 msw msw 0 2010-09-24 01:59 jack

你可以使rename更少沉默:

$ rename --verbose 's/ac/er/' j*k
jack renamed as jerk
$ rename --verbose 's/ac/er/' j*k   # nothing to rename
$