使用find与-exec执行bash命令时遇报错,求解决方案
问题说明
目录结构
log ├── table_a │ ├── log1 │ │ ├── 2022-01-01 │ │ │ └── hi.py │ │ └── 2022-01-02 │ ├── dummy_a │ │ ├── 2021-10-10 │ │ │ └── hello.txt │ │ ├── 2022-01-01 │ │ └── 2022-02-02 │ └── dummy_b │ ├── 2020-11-11 │ │ └── hey.docx │ └── 2021-03-28 ├── table_b │ ├── log1 │ │ └── 2022-01-11 │ ├── log2 │ └── logger └── table_c └── dummy3
需求
删除所有以dummy_和log开头的目录下、修改时间超过一年的日期命名子目录。测试阶段用-exec echo {} ;替代删除操作,预期输出:
log/table_a/log1/2022-01-01 log/table_a/log1/2022-01-02 log/table_a/dummy_a/2021-10-10 log/table_a/dummy_a/2022-01-01 log/table_a/dummy_a/2022-02-02 log/table_a/dummy_b/2020-11-11 log/table_a/dummy_b/2021-03-28 log/table_b/log1/2022-01-11
错误尝试及问题分析
命令1
find log/*/ \( -name log* -o -name dummy_* \) /* -type d -mtime +365 -exec echo {} \;
报错:
find: /Applications: unknown primary or operator
问题:多余的/*会被Shell解析为根目录下的所有文件/目录,导致find命令参数混乱,无法识别有效操作。
命令2、3
find log/*/ \( -name log* -o -name dummy_* \) -type d -exec find {} -type d -mtime +365 -exec echo {} \;
find log/*/ \( -name log* -o -name dummy_* \) -type d -exec find {} -type d -mtime +365 -exec echo {} \;\;
报错:
find: -exec: no terminating ";" or "+"
问题:嵌套的-exec需要正确转义分号,外层的;未转义会被Shell提前解析,导致find认为命令未完成。
解决方案
方案1:嵌套find(修正转义问题)
find log/*/ \( -name 'log*' -o -name 'dummy_*' \) -type d -exec find {} -type d -mtime +365 -exec echo {} \; \;
- 外层
find定位所有符合命名规则的父目录 - 内层
find筛选父目录下修改时间超一年的子目录 - 所有
;必须用反斜杠转义,通配符加单引号避免Shell提前展开
方案2:单find命令实现(更简洁)
find log -type d \( -path '*/log*/*' -o -path '*/dummy_*/*' \) -mtime +365 -exec echo {} \;
- 直接从
log根目录开始查找 -path匹配所有位于log*或dummy_*目录下的子目录- 确认输出符合预期后,将
echo替换为rm -rf即可执行删除操作
进阶:仅匹配日期格式目录
如果需要严格筛选YYYY-MM-DD格式的子目录,可添加正则匹配:
find log -type d \( -path '*/log*/*' -o -path '*/dummy_*/*' \) -regex '.*/[0-9]{4}-[0-9]{2}-[0-9]{2}' -mtime +365 -exec echo {} \;
内容的提问来源于stack exchange,提问作者lynn kuo
相关产品推荐
相关产品推荐

