如何在 bash 中仅匹配点文件?

如何在 bash 中仅匹配点文件?

rm -rf .*只会不会因为rm拒绝删除.而可怕地结束..

如何从全局模式中排除这些特殊目录?

这没有解决,dotglob因为我只想匹配以点开头的文件而不是所有文件。

答案1

对于bash,设置GLOBIGNORE特殊变量是一些非空值足以使其在扩展全局变量.时忽略..。从Bash 文档:

shellGLOBIGNORE变量可用于限制与模式匹配的文件名集。如果GLOBIGNORE设置,GLOBIGNORE则将从匹配列表中删除也与其中模式之一匹配的每个匹配文件名。如果nocaseglob设置了该选项,则执行与 中的模式的匹配GLOBIGNORE,而不考虑大小写。当设置且不为空时,文件名...始终被忽略 。GLOBIGNORE但是,设置GLOBIGNORE为非空值具有启用 dotglob shell 选项的效果,因此以‘.' 开头的所有其他文件名都将匹配。

如果我们将其设置为.:..,则.和都..将被忽略。由于将其设置为任何非空也会得到此行为,因此我们不妨将其设置为.

所以:

GLOBIGNORE=.
rm -rf .*

(从我之前在 Ask Ubuntu 上的回答.)

答案2

这应该可以做到:

rm -rf .[^.] .??*  

该命令可以捕获所有情况。

.[^.]将捕获任意两个字符条目。 .??*只匹配 3 个以上字符的文件名。

答案3

我认为@Goro 有最简单、完全正确的答案。然而,我发现打字很痛苦。我建议改为

ls .??*

确实,这会丢失诸如 之类的文件.a,但这些文件非常罕见,因此在实践中我认为这并不重要,尤其是对于交互式使用。

答案4

extglob

$ shopt -s extglob
$ touch ... .a .bbb ..c foo
$ echo .!(.|)
... .a .bbb ..c

!(.|)匹配除点或空之外的任何内容,因此.!(.|)匹配以点开头的任何内容,除了...

相关内容