sh.3.ll Asked: 2019-10-25 08:37:41 +0800 CST2019-10-25 08:37:41 +0800 CST 2019-10-25 08:37:41 +0800 CST 为什么这个(扩展的)通配符与我要排除的文件名匹配? 772 为什么运行命令时显示“myscript.txt” $ ls !(my)*.txt myscript.txt hey.txt 同样,bash 是如何解释$ ls !(my)*.txtand的$ ls !(my*).txt? bash 1 个回答 Voted Best Answer Stéphane Chazelas 2019-10-25T08:40:15+08:002019-10-25T08:40:15+08:00 !(my)*.txt匹配myscript.txt因为 !(my)匹配空字符串 *匹配myscript .txt匹配.txt (或在空字符串上匹配,或!(my)在myscript...上匹配)。*!(my)m*yscript 如果!(my*).txt要匹配以 . 结尾.txt且不以my. 请注意,这!(*)是一个特定于 ksh 的运算符。现在,它也得到了支持,bash但仅在extglob选项打开且仅在选项时才支持,但仅zsh在kshglob选项打开时。 zsh也有它自己extendedglob的 s ,它带有它的^否定运算符和~ except / and-not运算符: set -o extendedglob ls -ld -- (^my*).txt ls -ld -- *.txt~my* except / and-not运算符可以通过以下方式实现ksh93: ls -ld -- @(*.txt&!(my*)) 或与bash -O extglob旧版本的 ksh 与 ls -ld -- !(!(*.txt)|my*) 请注意,尽管它们与zsh'~运算符不同,后者适用于整个 glob 模式的最终过滤器,而!(...),@(...)只能对 glob 的单个路径组件进行操作(例如从 的扩展中*/b*~f*r排除)foo/bar*/b*
!(my)*.txt
匹配myscript.txt
因为!(my)
匹配空字符串*
匹配myscript
.txt
匹配.txt
(或在空字符串上匹配,或
!(my)
在myscript
...上匹配)。*
!(my)
m
*
yscript
如果
!(my*).txt
要匹配以 . 结尾.txt
且不以my
.请注意,这
!(*)
是一个特定于 ksh 的运算符。现在,它也得到了支持,bash
但仅在extglob
选项打开且仅在选项时才支持,但仅zsh
在kshglob
选项打开时。zsh
也有它自己extendedglob
的 s ,它带有它的^
否定运算符和~
except / and-not运算符:except / and-not运算符可以通过以下方式实现
ksh93
:或与
bash -O extglob
旧版本的 ksh 与请注意,尽管它们与
zsh
'~
运算符不同,后者适用于整个 glob 模式的最终过滤器,而!(...)
,@(...)
只能对 glob 的单个路径组件进行操作(例如从 的扩展中*/b*~f*r
排除)foo/bar
*/b*