Linux系统使用find命令无法递归删除大型目录问题求助
find删除报错根因及解决方案
报错原因
- 使用
-exec rm -fr {} \;触发「找不到文件或目录」报错:find默认遍历顺序为先处理父目录、再遍历子级内容,若匹配规则命中父目录,父目录会被优先删除,后续find尝试访问该目录下的子级路径时就会因路径不存在触发报错。 - 使用
-delete触发「目录不为空」报错:-delete参数隐含-depth选项(先处理子级、再处理父级),如果匹配规则未覆盖目录内的全部内容,或部分子内容因权限、进程占用无法删除,就会导致父目录删除时仍有残留,触发报错。
无需屏蔽stderr的解决方案
方案1:全量删除命中的所有文件+目录(含目录下所有内容)
给find命令增加-depth参数强制开启子级优先的遍历顺序,配合-exec即可从根源避免路径不存在的报错:
find /搜索根路径 [你的匹配规则] -depth -exec rm -fr {} \;
执行前可先替换-exec rm -fr {} \;为-print确认匹配结果,避免误删。
方案2:仅删除命中的文件和空目录
如果不需要删除非空的命中目录,可分两步执行,精准规避目录不为空的报错:
# 第一步删除所有命中的文件 find /搜索根路径 [你的匹配规则] -type f -delete # 第二步删除所有命中的空目录 find /搜索根路径 [你的匹配规则] -type d -empty -delete
特殊情况处理
如果执行上述命令仍有报错,可先检查对应路径的读写权限,或通过lsof 目标路径查询是否有进程占用该路径,终止占用进程后再执行删除操作。
内容的提问来源于stack exchange,提问作者jessefournier
相关产品推荐
相关产品推荐

