Linux下如何删除不在保留列表中的目录及其子目录与所有文件
正确删除非保留顶层目录的实现方法
此前命令错误原因
你之前执行的
find . ! -name 'lisst.txt' -type d -exec rm -vrf {} +会匹配当前路径下所有名称不是lisst.txt的目录(包含所有层级的子目录),没有限制目录查找深度,也没有匹配保留目录的规则,因此会直接删除全部目录导致误删。
前置检查
- 首先确认
lisst.txt中每行仅写一个要保留的顶层目录名称,无多余空格、空行或特殊字符,示例内容:
SAMN03272854 SAMN03272855
- 必须先执行测试命令,确认输出的所有目录都是你需要删除的对象,再执行删除操作,避免二次误删
通用操作命令(兼容含空格/特殊字符的目录名)
测试命令(仅输出待删除目录,不执行删除)
find . -maxdepth 1 -type d -print0 | while IFS= read -r -d '' dir; do # 去掉路径前缀./ dir_name=${dir#./} # 跳过当前目录本身 [ "$dir_name" = "." ] && continue # 不在保留列表中的目录就打印出来 grep -qxF "$dir_name" lisst.txt || echo "待删除:$dir_name" done
正式删除命令(核对测试输出无误后再执行)
find . -maxdepth 1 -type d -print0 | while IFS= read -r -d '' dir; do dir_name=${dir#./} [ "$dir_name" = "." ] && continue grep -qxF "$dir_name" lisst.txt || rm -vrf "$dir" done
简化版命令(仅适用于目录名无空格/特殊字符的场景)
测试命令
find . -maxdepth 1 -type d | sed 's/^\.\///' | grep -vxF -f lisst.txt | grep -v '^\.$'
正式删除命令
find . -maxdepth 1 -type d | sed 's/^\.\///' | grep -vxF -f lisst.txt | grep -v '^\.$' | xargs rm -vrf
内容的提问来源于stack exchange,提问作者PesKchan
相关产品推荐
相关产品推荐

