Franklin Asked: 2018-10-19 01:23:23 +0800 CST2018-10-19 01:23:23 +0800 CST 2018-10-19 01:23:23 +0800 CST 如何仅匹配 bash 中的点文件?[复制] 772 rm -rf .*不会因为rm拒绝删除.和... 如何从 glob 模式中排除这些特殊目录? 这没有解决,dotglob因为我只想匹配以点开头的文件而不是所有文件。 bash wildcards 6 个回答 Voted user88036 2018-10-19T01:29:10+08:002018-10-19T01:29:10+08:00 这应该这样做: rm -rf .[^.] .??* 该命令可以捕获所有情况。 .[^.]将捕获任何两个字符条目。 .??*只会匹配 3+ 个字符的文件名。 Best Answer muru 2018-10-19T02:00:09+08:002018-10-19T02:00:09+08:00 使用 bash,将GLOBIGNORE特殊变量设置为一些非空值足以使其在扩展 glob 时.被忽略。..来自Bash 文档: GLOBIGNOREshell 变量可用于限制匹配模式的文件名集。如果设置,则从匹配列表中删除GLOBIGNORE每个也匹配其中一个模式的匹配文件名。GLOBIGNORE如果设置了该选项,则在不考虑大小写的情况下执行nocaseglob与模式的匹配。当设置且不为空时GLOBIGNORE,文件名.和..总是被忽略 。GLOBIGNORE但是,设置GLOBIGNORE为非空值具有启用 dotglob shell 选项的效果,因此所有其他以‘.' 开头的文件名都将匹配。 如果我们将其设置为.:..,两者.和..都将被忽略。由于将其设置为任何非 null 也会得到此行为,我们不妨将其设置为. 所以: GLOBIGNORE=. rm -rf .* (来自我之前在 Ask Ubuntu 上的回答。) Dale Hagglund 2018-10-19T01:50:10+08:002018-10-19T01:50:10+08:00 我认为@Goro 有最简单的完全正确的答案。但是,我发现打字很痛苦。我建议改为 ls .??* 确实会错过像.a. jimmij 2018-10-19T01:29:33+08:002018-10-19T01:29:33+08:00 您需要排除单点和双点: rm -rf {..?,.[!.]}* ..?*用两个点匹配所有内容,后跟任何内容 .[!.]*匹配所有单点而不是另一个点 ilkkachu 2018-10-19T01:34:04+08:002018-10-19T01:34:04+08:00 与extglob: $ shopt -s extglob $ touch ... .a .bbb ..c foo $ echo .!(.|) ... .a .bbb ..c !(.|)匹配除点或空之外的任何内容,因此.!(.|)匹配以点开头的任何内容,除了.and ..。 Kusalananda 2018-10-19T01:59:24+08:002018-10-19T01:59:24+08:00 使用find时,打字会多一些,但您可以更明确,这样更容易理解: find . -maxdepth 1 -name '.*' ! -name . ! -name .. -exec rm -rf {} + 这将调用rm -rf当前目录中(仅)以点开头且不是.nor的所有名称..。我没有-delete在这里使用,因为该谓词可能不会删除非空目录。 如果您只想匹配当前目录中的常规文件,则变得更加容易: find . -maxdepth 1 -type f -name '.*' -delete 在这里,我们不需要排除.或..因为它们被自动排除-type f。 更改-type f为! -type d使其删除任何非目录(即符号链接等)
这应该这样做:
该命令可以捕获所有情况。
.[^.]
将捕获任何两个字符条目。.??*
只会匹配 3+ 个字符的文件名。使用 bash,将
GLOBIGNORE
特殊变量设置为一些非空值足以使其在扩展 glob 时.
被忽略。..
来自Bash 文档:如果我们将其设置为
.:..
,两者.
和..
都将被忽略。由于将其设置为任何非 null 也会得到此行为,我们不妨将其设置为.
所以:
(来自我之前在 Ask Ubuntu 上的回答。)
我认为@Goro 有最简单的完全正确的答案。但是,我发现打字很痛苦。我建议改为
确实会错过像
.a
.您需要排除单点和双点:
..?*
用两个点匹配所有内容,后跟任何内容.[!.]*
匹配所有单点而不是另一个点与
extglob
:!(.|)
匹配除点或空之外的任何内容,因此.!(.|)
匹配以点开头的任何内容,除了.
and..
。使用
find
时,打字会多一些,但您可以更明确,这样更容易理解:这将调用
rm -rf
当前目录中(仅)以点开头且不是.
nor的所有名称..
。我没有-delete
在这里使用,因为该谓词可能不会删除非空目录。如果您只想匹配当前目录中的常规文件,则变得更加容易:
在这里,我们不需要排除
.
或..
因为它们被自动排除-type f
。更改
-type f
为! -type d
使其删除任何非目录(即符号链接等)