如何实现两个目录中对应文件的命令输出一对一diff对比?
解决对应文件的wgrib2输出一对一diff对比问题
问题场景
需要对两个目录中名称前缀对应的文件(如directory1的file1_serv1对应directory2的file1_serv2),执行wgrib2 -var命令后的输出做一对一diff对比。
现有嵌套循环脚本会遍历所有文件组合,产生非预期的交叉对比结果:
file1_serv1 file1_serv2 file1_serv1 file2_serv2 file2_serv1 file1_serv2 file2_serv1 file2_serv2
现有脚本代码:
for i in directory1/*; do for j in directory2/*; do diff <(wgrib2 -var "$i") <(wgrib2 -var "$j") done done
目录结构:
directory1: directory2: file1_serv1 file1_serv2 file2_serv1 file2_serv2
正确实现方法
核心是只匹配同前缀的对应文件,而非遍历所有组合,以下是三种可靠实现方式:
方式一:提取文件名前缀匹配
遍历directory1的文件,提取每个文件的前缀,拼接出directory2中的对应文件路径:
for file in directory1/*; do # 提取纯文件名(去掉目录路径) filename=$(basename "$file") # 截取文件名前缀(去掉末尾的_serv1) prefix=${filename%_serv1} # 生成对应目录的文件路径 counterpart="directory2/${prefix}_serv2" # 检查文件存在性,避免无意义报错 if [ -f "$counterpart" ]; then echo "=== 对比 $file 和 $counterpart ===" diff <(wgrib2 -var "$file") <(wgrib2 -var "$counterpart") else echo "警告:$counterpart 不存在,跳过此对比" fi done
方式二:直接遍历已知前缀列表
如果文件前缀是固定已知的,可直接遍历前缀生成对应文件路径:
for prefix in file1 file2; do file1="directory1/${prefix}_serv1" file2="directory2/${prefix}_serv2" if [ -f "$file1" ] && [ -f "$file2" ]; then echo "=== 对比 $file1 和 $file2 ===" diff <(wgrib2 -var "$file1") <(wgrib2 -var "$file2") else echo "警告:$file1 或 $file2 不存在,跳过此对比" fi done
方式三:用sed替换文件名后缀
如果文件名后缀规则固定(_serv1和_serv2),可通过sed替换后缀快速匹配对应文件:
for file in directory1/*_serv1; do # 替换目录和后缀,得到对应文件路径 counterpart=$(echo "$file" | sed 's/directory1\///; s/_serv1/_serv2/') counterpart="directory2/$counterpart" if [ -f "$counterpart" ]; then echo "=== 对比 $file 和 $counterpart ===" diff <(wgrib2 -var "$file") <(wgrib2 -var "$counterpart") fi done
内容的提问来源于stack exchange,提问作者klex52s
相关产品推荐
相关产品推荐

