zsh中如何删除文件夹内所有文件但保留文件夹本身
ZSH 删除目录内所有内容(保留目录本身)最优方案
直接在目标目录下执行以下命令即可:
rm -rf -- *(D)
写法说明
- 末尾的
(D)是ZSH自带的通配符修饰符,效果是让*能匹配到目录下所有条目,包括.开头的隐藏文件、隐藏文件夹,而且绝对不会匹配到代表当前目录的.和上级目录的..,从根上就不会触碰当前目录,连临时匹配到特殊目录的可能都没有,完全满足不能删当前文件夹的要求。 - 中间加
--是标准的命令参数终止标识,防止遇到名字以-开头的文件时,rm把文件名错当成命令参数,不管多奇怪的文件名都能正常处理。
方案适配性说明
你之前用的rm -rf {.,}*本质是拆成.*和*两个匹配规则:如果目录里没有隐藏文件,.*就会匹配到.和..这两个特殊目录,要么直接报通配匹配失败的错,要么弹出特殊目录操作的风险提示,命令跑不全,就得再补一次rm -rf *。两次独立调用rm,肯定会触发两次确认提示,就算用;把两条命令拼到一起也解决不了,毕竟是启动了两次程序。
这个单命令写法完全覆盖所有要求:
- 无论目录内是否存在隐藏文件,都能一次匹配所有待删除内容,不需要补跑命令
- 全程不会匹配到当前目录的特殊条目,不存在任何删除当前目录的风险
- 仅调用一次rm程序,只会触发一次确认提示,没有重复弹窗问题
扩展用法(支持指定目录操作)
如果需要直接删除任意指定目录下的所有内容、保留目录本身,直接把目标路径写在通配符前即可,不需要切换工作目录,属于额外加分的适配场景:
# 示例:删除/your/target/path目录下所有内容,保留该目录本身 rm -rf -- /your/target/path/*(D)
怕手滑的话,第一次用可以先把
rm -rf换成ls -la跑一遍,先列出来所有会被匹配到的内容,确认没选错再执行删除操作,稳一点。
内容的提问来源于stack exchange,提问作者Felix Dombek
相关产品推荐
相关产品推荐

