从全局匹配中排除模式

rew*_*ire 6 bash wildcards pattern-matching

我的目录如下所示:

$ ls
total 0
-rw-r--r-- 1 user user 0 Jun 18 22:44 file0
-rw-r--r-- 1 user user 0 Jun 18 22:44 file1
-rw-r--r-- 1 user user 0 Jun 18 22:44 file2
-rw-r--r-- 1 user user 0 Jun 18 22:44 file3
-rw-r--r-- 1 user user 0 Jun 18 22:44 file4
-rw-r--r-- 1 user user 0 Jun 18 22:44 file5
-rw-r--r-- 1 user user 0 Jun 18 22:44 file6
-rw-r--r-- 1 user user 0 Jun 18 22:44 file7
-rw-r--r-- 1 user user 0 Jun 18 22:44 file8
-rw-r--r-- 1 user user 0 Jun 18 22:44 file9
Run Code Online (Sandbox Code Playgroud)

使用 bash 通配符,我想file2匹配file6,排除 file3。

由于我找不到and匹配多个模式的运算符,我想我只是使用德摩根定律,它a AND b相当于!(!a OR !b)并写

!(!(file[2-6])|file3)
Run Code Online (Sandbox Code Playgroud)

其按预期工作:

$ echo !(!(file[2-6])|file3)
file2 file4 file5 file6
Run Code Online (Sandbox Code Playgroud)

有没有更简单、更直接的方法来实现这一目标?

sch*_*ity 4

您可以应用两个 range [24-6],其中2是第一个,4-6是第二个:

$ ls file[24-6]
file2 file4 file5 file6
Run Code Online (Sandbox Code Playgroud)

另一个例子:

$ ls file[2356]
file2 file3 file5 file6
Run Code Online (Sandbox Code Playgroud)

文档:

范围

有一个特殊约定:用“-”分隔的两个字符表示一个范围。(因此,“[A-Fa-f0-9]”相当于“[ABCDEFabcdef0123456789]”。)可以通过将“-”作为括号之间的第一个或最后一个字符来包含其字面含义。(因此,“[]-]”仅匹配两个字符“]”和“-”,“[--0]”匹配三个字符“-”、“.”、“0”,因为“/”无法匹配。)