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