假设我有一组七个文件:
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 文件通过引用一条评论对于我的问题。
对我来说相关的短语是这样的,
需要注意的关键是
!(…)
已经像*
,因为它本身与任何不属于内部事物之一的事物相匹配。
我并不认为它等同于*
,这是我理解的障碍。