在Bash中能否用正则表达式排除指定文件?
问题:用ls列出排除指定前缀的文件
现有文件如下:
aaa-a1 aaa-a2 c d eee-e1
能否为ls命令编写正则表达式,列出除aaa*和eee*之外的所有文件?我在JavaScript里会这么写:
^/(?!aaa|eee)([a-z0-9]+)$
但ls ^/(?!aaa|eee)([a-z0-9]+)$在Bash里并非有效写法。
解决方法
Bash中ls使用的是**文件名通配(glob)**而非正则表达式,因此无法直接套用JavaScript的正则语法。以下两种方法可以实现你的需求:
方法1:使用Bash扩展glob排除匹配
首先确保开启扩展glob功能(默认可能未开启):
shopt -s extglob
然后执行以下命令即可列出目标文件:
ls !(aaa*|eee*)
!(pattern)是扩展glob的语法,表示匹配所有不符合括号内模式的文件,这里就会排除所有以aaa或eee开头的文件。
方法2:结合ls与grep过滤输出
如果不想修改shell选项,也可以用grep的正则反向匹配来过滤ls的结果:
ls | grep -v "^aaa\|^eee"
-v参数表示反向匹配,即输出不满足正则条件的内容^aaa\|^eee表示匹配以aaa或eee开头的行,反向后就得到了排除这些前缀的文件列表
内容的提问来源于stack exchange,提问作者Sandra Schlichting
相关产品推荐
相关产品推荐

