保留指定子目录并清理父目录其余内容的命令问题求助
保留指定目录并删除parent下其他内容的正确方法
目录结构
/parent/ /parent/child1/ /parent/child2/ . . . /parent/child1/sub1/sub2/sub3/ /parent/child1/subA/subB/ /parent/child1/subX/subY/ . . . /parent/child1/subX/subY/subZ/ /parent/child1/subA/subB/
需求
仅保留 parent/child1/sub1/sub2/sub3/,删除parent文件夹中的所有其他内容。
你尝试的命令问题
你执行的命令:
find ./parent -mindepth 1 -type d -not -path "*/sub3*" -exec rm -rf {} \;
存在两个关键问题:
- 遍历顺序错误:
find默认从上到下遍历目录,会先处理parent/child1——这个路径不包含sub3,会被直接删除,导致你要保留的sub3也跟着被删掉。 - 路径匹配太宽泛:
*/sub3*会匹配所有包含sub3的路径,但无法保护sub3的上层父目录(比如child1、sub1、sub2),这些父目录会被误删。
另外你提到该命令删除了/parent/child2/sub1/sub2/,这其实是符合需求的(因为child2属于要删除的内容),但你的核心问题应该是想要保留的sub3目录也被删掉了。
正确解决方案
方法一:用find精确保护路径链+从底层遍历
使用-depth让find从最底层目录开始处理,同时精确排除要保留的目录及其所有父目录:
find ./parent -mindepth 1 -depth -type d \ ! -path "./parent/child1" \ ! -path "./parent/child1/sub1" \ ! -path "./parent/child1/sub1/sub2" \ ! -path "./parent/child1/sub1/sub2/sub3" \ -exec rm -rf {} \;
如果系统支持-delete选项(大部分现代Linux发行版都支持),可以替换-exec rm -rf {} \;为-delete,更高效安全:
find ./parent -mindepth 1 -depth -type d \ ! -path "./parent/child1" \ ! -path "./parent/child1/sub1" \ ! -path "./parent/child1/sub1/sub2" \ ! -path "./parent/child1/sub1/sub2/sub3" \ -delete
方法二:临时移动保留目录(更直观)
先把要保留的目录移到临时位置,清空parent后再移回去:
# 移动保留目录到临时位置 mv ./parent/child1/sub1/sub2/sub3 /tmp/ # 清空parent下所有内容 rm -rf ./parent/* # 重建必要的父目录并移回保留的目录 mkdir -p ./parent/child1/sub1/sub2/ mv /tmp/sub3 ./parent/child1/sub1/sub2/
内容的提问来源于stack exchange,提问作者Anmol Pandita
相关产品推荐
相关产品推荐

