Bash如何删除指定目录下除任意嵌套的目标文件夹外的所有目录
Bash 保留嵌套目录删除其他文件夹解决方案
核心问题根源:原有命令会直接删除待保留目录的上级父目录,导致嵌套层级的目标目录被连带删除,解决方案需要同时保留目标目录及它的所有上级父目录。
方案:find 命令实现(全嵌套层级兼容)
操作步骤
- 先定义你需要保留的目录完整路径,示例中要保留
./release/feature/footer的写法:KEEP_PATH="./release/feature/footer" - 先执行预览命令确认待删除的目录列表,避免误删:
find ./release -type d -depth -print0 | grep -vzE "^$(echo $KEEP_PATH | sed 's/\//\\\//g')(/|$)" | xargs -0 echo "待删除目录:"
- 确认列表无误后,执行正式删除命令:
find ./release -type d -depth -print0 | grep -vzE "^$(echo $KEEP_PATH | sed 's/\//\\\//g')(/|$)" | xargs -0 rm -rf
命令说明
-depth参数:让find从最深层的子目录开始遍历,优先删除子目录再处理父目录,避免父目录提前被删导致子目录遍历异常-print0+xargs -0:适配路径中包含空格、特殊字符的场景,不会出现路径截断错误- grep 过滤规则:自动排除目标目录本身、目标目录的所有上级父目录、目标目录内部的所有子目录,确保这些路径不会被删除
多目录保留适配
如果需要同时保留多个目录,只需要修改KEEP_PATH的赋值,用|分隔多个路径即可,示例同时保留test-folder2和feature/footer:KEEP_PATH="./release/feature/footer|./release/test-folder2"
内容的提问来源于stack exchange,提问作者Constantin.FF
相关产品推荐
相关产品推荐

