bash排除通配符

在bash中我要批量对某些文件做操作可以使用通配符(globbing),但是如果我想排除一些文件,对其他所有文件做操作,要怎么写呢?比如我要把除了sam以外的所有文件(夹)移到sam里面呢?

[fox@fox-server ~/fox]$ ll
total 41344
drwxr-xr-x   3 client      boss            96 Dec  2 08:23 decrypt
drwxr-xr-x   9 client      boss          1024 Dec  2 08:23 crypt
drwxr-xr-x  12 client      boss          1024 Dec  2 08:23 sain
-rw-r-----   1 client      boss       21155328 Dec  2 08:23 sam.tar
drwxr-xr-x   2 client      boss          1024 Dec  2 08:37 sam
drwxr-xr-x   7 client      boss          1024 Dec  2 08:23 FBIAgent

这时候我们可以用

mv !(sam) sam/

就可以对排除sam以外的所有文件做操作。我也可以在这里配合其他通配符使用,比如我要保留所有s打头的文件,我可以这样

mv !(s*) sam/

是不是很简单?你是不是很激动的打开了一个bash想试一试?你一般是不会成功的,而是看到一条错误提示

-bash: !: event not found

因为!通配符属于扩展通配符,必须通过,shopt将bash的扩展通配符开关开启才可以使用,开启的方法如下:

shopt -s extglob

这个例子不大恰当,其实这里直接mv * sam/就好了,只要忽略一条错误mv: sam and sam are identical
只是我一时半会儿想不出更好的例子了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.