我有几个具有相同基本文件名的文件。我想删除除一个以外的所有
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.o
和foo.or
。这种模式是如何工作的,一个只 忽略的 globfoo.org
会是什么样子?
我正在尝试调整一些完成。假设我有:
$ 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”前缀)。