You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BASH中查找含B的子目录并在其中grep指定文件的问题

批量在指定子目录执行grep命令的问题修复

问题场景

现有目录结构如下:

./1/A
./1/B
./2/A
./2/B
./3/A
./3/B

需要找出所有名为B的子目录,并在每个B目录下执行grep命令,匹配.out扩展名的文件,预期执行的命令为:

grep -ro '...match_pattern...' ./1/B/*.out
grep -ro '...match_pattern...' ./2/B/*.out
grep -ro '...match_pattern...' ./3/B/*.out

但现有脚本执行后生成的命令出现错误,路径与*.out之间多了空格,无法正确匹配文件。

原脚本的错误点

原脚本存在3处关键错误:

  1. find命令语法错误:find . -type d B未指定匹配规则,正确应该用-name参数定位目录
  2. 数组遍历语法错误:for i in "(LIST[@]}"的引号和括号写法错误,无法正确遍历数组元素
  3. 路径拼接错误:$i*.out未正确引用变量,导致shell解析时出现不必要的空格分隔

修正后的脚本

# 获取所有名为B的子目录,移除路径开头的./
readarray -t LIST < <(find . -type d -name "B" | sed 's/^\.\///')

# 遍历每个B目录并执行grep
for dir in "${LIST[@]}"; do
    grep -ro '...match_pattern...' "${dir}"/*.out
done

关键修正说明

  • find . -type d -name "B":准确查找所有类型为目录、名称为B的路径
  • readarray -t:读取find结果时自动移除每行末尾的换行符,避免路径包含无效字符
  • sed 's/^\.\///':比cut -c 3-更可靠地移除路径开头的./,适配不同长度的前缀路径
  • "${LIST[@]}":正确遍历数组,避免路径中出现空格时的解析错误
  • "${dir}"/*.out:确保目录路径与通配符正确拼接,不会出现空格分隔的问题

内容的提问来源于stack exchange,提问作者Scripter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:01:06