find命令异常:无法正确删除指定隐藏文件夹(需保留特定目录外过期文件)
修正find命令以实现指定删除需求
问题分析
你的需求是删除all/mainfolder下修改时间超过2分钟的所有文件/目录,但需排除:
mainfolder/.ssh目录及其内部所有内容- 所有名为
.sync的文件/目录
原命令存在两个关键问题:
-type d,f语法错误:find的-type选项仅支持单个类型参数(如d代表目录,f代表文件),不能同时写d,f,这会导致该条件失效,破坏整个排除逻辑。- 路径匹配范围不足:原命令的
-path all'/*/.ssh'仅匹配all下一级目录中的.ssh(如all/mainfolder/.ssh),无法匹配更深层级的.ssh目录(如all/mainfolder/test/.ssh),但从你的问题描述看,你实际希望保留的是mainfolder/.ssh,而test/.ssh属于需要删除的范围——原命令的错误语法导致排除逻辑混乱,才出现该目录未被删除的情况。
解决方案
推荐使用-prune选项高效排除指定目录(避免递归搜索被排除的路径),同时修正语法错误:
find all/mainfolder -mindepth 1 \( -name ".sync" -o -path "all/mainfolder/.ssh" -type d \) -prune -o -mmin +2 -delete >/dev/null
命令解释
find all/mainfolder:精准指定搜索起点为all/mainfolder,避免处理all下的其他无关子目录-mindepth 1:跳过mainfolder目录本身,仅处理其内部内容\( -name ".sync" -o -path "all/mainfolder/.ssh" -type d \) -prune:匹配.sync文件/目录,以及mainfolder/.ssh目录,执行-prune跳过这些路径的递归搜索(直接排除)-o -mmin +2 -delete:对未被排除的内容,匹配修改时间超过2分钟的文件/目录,执行删除操作
如果你的需求是排除所有层级的.ssh目录(包括test/.ssh),可以调整为:
find all/mainfolder -mindepth 1 \( -name ".sync" -o -name ".ssh" -type d \) -prune -o -mmin +2 -delete >/dev/null
内容的提问来源于stack exchange,提问作者sangul
相关产品推荐
相关产品推荐

