使用 bash extglob 匹配否定模式

使用 bash extglob 匹配否定模式

假设我有一组七个文件:

item1_data
item2_data_more
item3_data
item4_data
item5_data_more
other6_data
other7_data_more

item我想匹配以 开头但不以 结尾的三个more。鉴于这是一个示例场景,您必须接受仅与正匹配模式item*data?(或任何简单变体)匹配是不够的。

我正在使用bash启用extglob。对于简单的情况,手册页中的描述就足够了(“!(pattern‐list)匹配除给定模式之一之外的任何内容")。但是,在这里我需要实现对 的匹配,item但对 的匹配却是负匹配data。我最终找到了一个有效的匹配,但我不明白的是为什么它有效但其他匹配却失败了。

shopt -s extglob                                                # Enable extended globbing
touch {item{1,3,4},other6}_data {item{2,5},other7}_data_more    # Example data set

ls !(*more)                                                     # Non-"item" files too
item1_data  item3_data  item4_data  other6_data

ls item*!(more)                                                 # All "item" files
item1_data  item2_data_more  item3_data  item4_data  item5_data_more

ls item!(*more)                                                 # Works as required
item1_data  item3_data  item4_data

为什么第二个失败而第三个成功?我认为通配符在任一位置都应该有效 - 但显然不是。有人可以启发我吗?

答案1

我想说第二个表达式失败,因为item*匹配每个文件的整个文件名,并且末尾的空字符串通常匹配!(more).

答案2

我需要的答案可以在其中之一找到其他答案对这个问题在 Bash 中,如何在提供多个异常的同时针对通配符 rm 文件通过引用一条评论对于我的问题。

对我来说相关的短语是这样的,

需要注意的关键是!(…)已经像*,因为它本身与任何不属于内部事物之一的事物相匹配。

我并不认为它等同于*,这是我理解的障碍。

相关内容