假设我有一组七个文件:
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
为什么第二个失败而第三个成功?我认为通配符在任一位置都应该有效 - 但显然不是。有人可以启发我吗?
我想说第二个表达式失败,因为
item*
匹配每个文件的整个文件名,并且末尾的空字符串通常匹配!(more)
.我需要的答案可以在In Bash问题的其他答案之一中找到,我如何针对通配符 rm 文件,同时提供通过对我的问题的评论引用的多个异常。
对我来说相关的短语是这样的,
我并不认为它等同于
*
,这是我理解的障碍。