如何获得通配符扩展的互补结果?
roc
如果我想列出名称中包含的文件,我可以运行
ls *roc*
roc
但如果我想要名称中没有的所有文件怎么办?
ls *[!r][!o][!c]*
和ls *[!roc]*
不工作。有没有一种简单的方法来进行这种“相反”的扩展?
注意:我正在使用bash
答案1
bash
如果您使用以下命令启用它们,则 shell 支持扩展的通配模式
shopt -s extglob
一旦启用,该模式!(*roc*)
将匹配任何不匹配的非隐藏名称*roc*
,即任何不包含字符串的名称roc
。
从bash
手册:
如果
extglob
使用内置选项启用 shell 选项shopt
,则会识别多个扩展模式匹配运算符。在以下描述中,apattern-list
是由 分隔的一个或多个模式的列表|
。复合图案可以使用以下子图案中的一种或多种来形成:
?(pattern-list)
匹配零次或一次出现的给定模式
*(pattern-list)
匹配零次或多次出现的给定模式
+(pattern-list)
匹配给定模式的一次或多次出现
@(pattern-list)
匹配给定模式之一
!(pattern-list)
匹配除给定模式之一之外的任何内容
答案2
注意:这不是您所要求的,只是提供您所要求的解决方法
通常我会重新思考问题,所以我会这样做:
ls * | grep -v roc
我更喜欢使用常用工具(以及我使用的常用命令),而不是寻找我可能每年使用一次的东西(所以我可能会忘记)。
使用通配符可能会变得非常复杂:不同的 shell 有不同的结果,因此可能会使脚本不可移植。