You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 15:06:05