如何在多层目录中删除所有文件,仅保留含.regions子串的文件
问题解决方法
错误原因
你之前执行的命令报错主要由3个问题导致:
- 仅开启了
extglob扩展匹配,未开启globstar选项,**递归匹配语法无法生效 extglob的!()反匹配语法作用于当前层级的路径项,不能直接在模式内嵌套**递归路径,你写的!(./**/*.regions*)会被shell识别为要删除字面名称为!(./**/*.regions*)的文件,自然找不到对应路径rm -r是递归删除目录的参数,你的需求是删除不符合规则的文件,逻辑不匹配还容易误删整个子目录
解决方案
方案1:使用find命令(兼容性最高,推荐)
find命令不需要额外开启shell选项,逻辑清晰不容易误操作,操作前建议先预览要删除的文件,确认无误后再执行删除:
- 预览待删除的文件,确认输出内容都是你要删除的文件:
find my_dirs/ -type f ! -name "*.regions*" -print
- 确认无误后执行删除:
find my_dirs/ -type f ! -name "*.regions*" -delete
- 如果你需要同时清理删除文件后剩下的空目录,追加执行以下命令:
find my_dirs/ -type d -empty -delete
方案2:使用shell扩展glob匹配
如果习惯用glob语法匹配,可以开启对应shell选项后执行操作:
- 开启所需的shell扩展:
shopt -s extglob globstar
- 进入my_dirs目录后先预览待删除文件:
echo **/!(*.regions*)
- 确认无误后执行删除:
rm -- **/!(*.regions*)
注:
--参数用于避免文件名以-开头时被识别为rm的命令参数,不加-r参数的rm不会删除子目录,符合你保留目录结构的需求。
内容的提问来源于stack exchange,提问作者Valentin
相关产品推荐
相关产品推荐

