通配符否定

通配符否定

如何获得通配符扩展的互补结果?

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 有不同的结果,因此可能会使脚本不可移植。

相关内容