0

我有一堆这种格式的按顺序命名的文件:imageXXX.jpg. 所以它会像image001.jpg和向前一样。我只想保留其中的数字部分,并去掉前面0的 's. 因此,该文件将被命名为1.jpg. 我如何使用 Bash 来实现这一点?

4

2 回答 2

3

纯重击:

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

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

于 2010-09-23T05:55:40.700 回答
2

在 Linux 上,古老的 Perl 实用程序重命名是友好的:

$ 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如果您给它提供格式错误的参数, likechmod会抱怨,但如果您的请求无效,两者都会保持沉默。例如

$ 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
$                  
于 2010-09-23T02:52:09.117 回答