Linux系统如何使用rm命令删除目录内除指定子目录外的内容
问题原因
你执行的命令报错核心原因是:-not 是find命令的匹配规则参数,并非rm命令的原生选项,直接传给rm时会被识别为无效选项,因此触发invalid option -- 'n'报错。
可行解决方案
以下方案均在CentOS 7环境验证可用,你可以根据场景选择:
- 方案1:find匹配删除(最稳妥,无依赖,适合批量场景)
该方案不需要修改shell配置,通过find精准匹配要删除的内容,不会误深入dir2目录操作:
参数说明:# 直接在当前路径执行即可,不需要切换目录 find ./jpeg -maxdepth 1 ! -name 'dir2' ! -name 'jpeg' -exec rm -rf {} +-maxdepth 1:仅匹配jpeg目录下的一级内容,不会递归进入dir2等子目录! -name 'dir2':排除要保留的dir2目录! -name 'jpeg':排除jpeg目录本身,避免把整个jpeg目录删掉
- 方案2:bash扩展通配符删除(写法最简洁)
开启bash的extglob扩展通配符支持后,可以直接用排除语法匹配要删除的内容:
其中# 临时开启扩展通配符 shopt -s extglob # 执行删除 rm -rf jpeg/!(dir2) # 操作完成后可选择关闭扩展通配符,恢复默认shell行为 shopt -u extglobjpeg/!(dir2)会自动匹配jpeg目录下除了dir2之外的所有文件、子目录。 - 方案3:明确指定删除目标(最不容易出错,适合目录内容少的场景)
你当前jpeg目录下需要删除的内容是固定的3个jpeg文件和dir1目录,直接指定路径删除即可,完全没有匹配误判风险:rm -rf jpeg/1.jpeg jpeg/2.jpeg jpeg/3.jpeg jpeg/dir1
安全提示
执行带rm -rf的命令前,建议先把命令里的rm -rf替换成ls执行一次,确认输出的待操作文件列表完全符合预期后,再替换回rm -rf执行,避免误删重要数据。
内容的提问来源于stack exchange,提问作者user1068636
相关产品推荐
相关产品推荐

