核心目标是只删除当前目录里面的子文件夹,保留普通文件,不是把所有文件和文件夹全部删掉,主要使用 rm 命令搭配 find 命令实现,rm 本身无法自动区分文件和目录,所以单纯 rm -rf 会把文件也一起删除,这个是新手最容易踩坑的地方,执行之前一定要确认当前路径,使用 pwd 查看当前目录,防止误删上级或者系统目录,删除操作是不可逆的,没有回收站,生产环境执行前建议先测试预览,确认匹配到的目录是不是想要删除的目标。
一 推荐命令 find 方式 只删子目录
find . -maxdepth 1 -type d ! -name "." -exec rm -rf {} \;
参数解释
- . 代表当前目录
- -maxdepth 1 只查找当前这一层,不递归进入子文件夹内部继续查找
- -type d 筛选类型为目录
- ! -name "." 排除当前目录本身,防止把当前目录删除
- -exec rm -rf {} ; 对筛选出来的目录执行强制递归删除
预览测试版本,只列出不会删除,先确认匹配结果
find . -maxdepth 1 -type d ! -name "."
二 其他可选写法
写法 1 xargs 版本
find . -maxdepth 1 -type d ! -name "." | xargs rm -rf
优点写法简短,缺点如果目录名称带空格特殊字符,容易出错,推荐优先使用 - exec 版本
写法 2 shell 通配方式 不推荐
rm -rf /
这个写法简单,但是兼容性有限,部分 shell 环境会有异常,并且特殊名称目录处理不稳定,适合临时测试环境,不推荐生产使用
三 深度原理与关键特性
rm -rf 含义,r 递归删除,f 强制删除不提示确认,因为目录里面一般还有子内容,所以必须加 r 参数
maxdepth 1 非常关键,如果不加这个参数,find 会遍历所有层级,把深层嵌套目录全部识别删除,不符合只删除当前目录下一级子文件夹需求
-type d 就是筛选目录,普通文件类型是 f,所以这条命令不会触碰普通文件,满足只删文件夹保留文件的需求
四 常见踩坑场景
1 误用 rm -rf ,普通文件也被一起删除,没有实现只删除文件夹
2 忘记 - maxdepth 1,递归扫描所有层级,深层目录全部被删掉
3 没有排除当前目录,极端情况把当前工作目录本身删除
4 执行前没有 pwd 确认路径,在 /root/etc 这类系统目录执行,破坏系统
5 目录名称包含空格,xargs 版本拆分错误,删除异常
五 补充说明
如果需求是当前目录所有内容,包括文件和文件夹全部清空,命令是 rm -rf ,这个和本文需求不一样,一定要区分清楚
如果需要删除之后保留隐藏文件夹,上面 find 命令默认会包含隐藏目录,如果需要排除隐藏目录,可以额外增加筛选条件
【常见问题】
问题 1 linux 删除当前目录下所有文件夹,rm -rf 可以吗
回答 1 linux 删除当前目录下所有文件夹,rm -rf 不行,这个命令会同时删除普通文件和文件夹,不能做到只删除目录,需要使用 find -type d 筛选目录。
问题 2 linux 删除当前目录下所有文件夹,为什么要加 maxdepth 1
回答 1 linux 删除当前目录下所有文件夹,maxdepth 1 限制只查找当前第一层,如果不加,find 会递归查找所有子层级,把深层目录全部删除。
问题 3 linux 删除当前目录下所有文件夹,删除之后可以恢复吗
回答 1 linux 删除当前目录下所有文件夹,rm 删除默认不进回收站,删除之后很难恢复,执行前一定要预览匹配结果,重要数据提前备份。
问题 4 linux 删除当前目录下所有文件夹,带空格的目录名为什么 xargs 容易出错
回答 1 linux 删除当前目录下所有文件夹,xargs 默认按空格分割名称,目录名含有空格的时候会识别成多个名称,造成删除错误,所以优先使用 find -exec 写法。
【免责申明】
本文内容基于 linux rm find 命令通用用法整理,删除操作不可逆,执行 linux 删除当前目录下所有文件夹命令前确认工作目录,重要数据提前备份,严禁在系统关键目录执行,本文不对误删造成数据丢失承担责任。


