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