背景

比如最近我在备份Hexo的时候,多次需要调试效果,因为有备份一个文件夹叫hexo.zip,把这个传到服务器的网站根目录下,然后将其解压。但是之后再重建Hexo的时候需要将目录下所有文件除了hexo.zip都删除的时候,不能只用到简单的rm命令了。

方法

最简单的方法是开启extglob模式,开启之后Shell可以另外识别出下列5个模式匹配操作符,更加方便的匹配文件。

shopt 命令

shopt命令是set命令的一种替代,很多方面都和set命令一样,但它增加了很多选项。可有使用“-p”选项来查看shopt选项的设置。“-u”开关表示一个复位的选项,“-s”表示选项当前被设置。

# shopt -s extglob      #打开extglob模式
# shopt -u extglob      #关闭extglob模式

set 命令

set命令作用主要是显示系统中已经存在的shell变量,以及设置shell变量的新变量值。使用set更改shell特性时,符号”+“和”-“的作用分别是打开和关闭指定的模式。set命令不能够定义新的shell变量。如果要定义新的变量,可以使用declare命令以变量名=值的格式进行定义即可。

具体set命令可以参考官方手册

?(pattern-list) - 所给模式匹配0次或1次;

*(pattern-list) - 所给模式匹配0次以上包括0次;

+(pattern-list) - 所给模式匹配1次以上包括1次;

@(pattern-list) - 所给模式仅仅匹配1次;

!(pattern-list) - 不匹配括号内的所给模式。

操作命令实例

# shopt -s extglob      #打开extglob模式
# rm -fr !(file1)    #删除除了file1的所有文件

如果是多个要排除的,可以这样利用管道线:

# rm -rf !(file1|file2)  #删除除了file1和file2的所有文件
# rm -i !(*.zip)       #删除除了.zip 之外的所有文件
# shopt -u extglob      #关闭extglob模式

grep -v 反选

或者还可以利用 grep -v 反选操作 (推荐,支持正则表达式)

示例:

rm -rf `ls -a | grep -v "^tes"`  #删除目录下除了test 文件以外的其他文件以及文件夹

来源