小编jak*_*ake的帖子

从全局匹配中排除一种模式

我有几个具有相同基本文件名的文件。我想删除除一个以外的所有

foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc
Run Code Online (Sandbox Code Playgroud)

如果我不需要保留一个,我知道我可以使用rm foo.*.

TLDP演示^否定匹配。通过反复试验,我发现

rm foo.*[^org]
Run Code Online (Sandbox Code Playgroud)

做我需要的,但我不太了解语法。

此外,虽然在我的用例中不是限制,但我认为这种模式也忽略了foo.ofoo.or。这种模式是如何工作的,一个 忽略的 globfoo.org会是什么样子?

bash wildcards

84
推荐指数
3
解决办法
9万
查看次数

以排除模式开始一个 glob

我正在尝试调整一些完成。假设我有:

$ ls
bar.baz  foo_bar.baz  foo.bar
Run Code Online (Sandbox Code Playgroud)

如果我希望完成匹配所有不以 baz 结尾的文件:

$ shopt|grep extglob
extglob         on
$ compgen -G "*.!(baz)"
foo.bar
Run Code Online (Sandbox Code Playgroud)

exclude glob 按预期工作。但是如果我想要所有不以 foo 开头的文件:

$ compgen -G "!(foo)*"
bar.baz
foo.bar
foo_bar.baz
Run Code Online (Sandbox Code Playgroud)

所有文件仍然匹配。想必这是因为*还可以扩展匹配foo。是否有使用排除后跟的 glob 技巧*

正如 Janis 所指出的,排除 foo 需要是!(foo*),但实际用例也是匹配扩展名,因此 glob 需要通常采用以下形式!(foo*)*.bar(仍然无法排除“foo”前缀)。

bash wildcards

2
推荐指数
1
解决办法
4309
查看次数

标签 统计

bash ×2

wildcards ×2