rm -rf .*
只会不会因为rm
拒绝删除.
而可怕地结束..
。
如何从全局模式中排除这些特殊目录?
这没有解决,dotglob
因为我只想匹配以点开头的文件而不是所有文件。
答案1
对于bash,设置GLOBIGNORE
特殊变量是一些非空值足以使其在扩展全局变量.
时忽略..
。从Bash 文档:
shell
GLOBIGNORE
变量可用于限制与模式匹配的文件名集。如果GLOBIGNORE
设置,GLOBIGNORE
则将从匹配列表中删除也与其中模式之一匹配的每个匹配文件名。如果nocaseglob
设置了该选项,则执行与 中的模式的匹配GLOBIGNORE
,而不考虑大小写。当设置且不为空时,文件名.
和..
始终被忽略 。GLOBIGNORE
但是,设置GLOBIGNORE
为非空值具有启用 dotglob shell 选项的效果,因此以‘.
' 开头的所有其他文件名都将匹配。
如果我们将其设置为.:..
,则.
和都..
将被忽略。由于将其设置为任何非空也会得到此行为,因此我们不妨将其设置为.
所以:
GLOBIGNORE=.
rm -rf .*
答案2
这应该可以做到:
rm -rf .[^.] .??*
该命令可以捕获所有情况。
.[^.]
将捕获任意两个字符条目。
.??*
只匹配 3 个以上字符的文件名。
答案3
我认为@Goro 有最简单、完全正确的答案。然而,我发现打字很痛苦。我建议改为
ls .??*
确实,这会丢失诸如 之类的文件.a
,但这些文件非常罕见,因此在实践中我认为这并不重要,尤其是对于交互式使用。
答案4
和extglob
:
$ shopt -s extglob
$ touch ... .a .bbb ..c foo
$ echo .!(.|)
... .a .bbb ..c
!(.|)
匹配除点或空之外的任何内容,因此.!(.|)
匹配以点开头的任何内容,除了.
和..
。