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处关键错误:
- find命令语法错误:
find . -type d B未指定匹配规则,正确应该用-name参数定位目录 - 数组遍历语法错误:
for i in "(LIST[@]}"的引号和括号写法错误,无法正确遍历数组元素 - 路径拼接错误:
$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
相关产品推荐
相关产品推荐

