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
只是我一时半会儿想不出更好的例子了。

Comments

Popular posts from this blog

socket close shutdown函数区别

批量在文件头插入

hash表取模技巧