Bash脚本无法写入Perforce提交者信息至CSV文件求助
问题解决:Perforce提交者信息无法写入CSV文件
原脚本核心问题分析
- 本地路径与Perforce仓库路径不匹配:
p4 describe需要的是Perforce仓库中的文件路径(如//depot/path/to/file.c),但脚本中提取的$file是本地目录路径,Perforce无法识别。 - 提交者信息提取逻辑错误:原awk命令会同时输出变更号和用户名,导致
submitter变量包含换行符,写入CSV时格式混乱且不符合预期。 - CSV格式不规范:未添加表头,且用空格分隔数据,与预期的制表符分隔格式不符。
- 变量未加引号:目录路径或文件名含空格时,
diff等命令会解析错误。
修复后的脚本
#!/bin/bash # 配置Perforce环境变量 export P4PORT="perforceserver:port" export P4USER="user" export P4PASSWD="" # 设置本地目录(dir2为Perforce同步到本地的目录) local_dir1="/home/user1/code1/" local_dir2="/home/user1/code2/" # 对应的Perforce仓库根路径(需要根据实际depot路径修改) depot_root="//depot/project/" # 设置CSV输出文件 csvfile="comparison.csv" # 写入CSV表头 echo -e "Type\tcode1\tcode2\tDiffer\tPerforceOwner" > "$csvfile" # 对比目录并处理结果 diff -rq "$local_dir1" "$local_dir2" | sed 's/: /\t/g' | while read -r line; do # 提取本地文件路径(处理diff输出的两种格式:"Files X and Y differ" 或 "Only in X: Y") case "$line" in "Files"*) local_file1=$(echo "$line" | awk -F'\t' '{print $2}') local_file2=$(echo "$line" | awk -F'\t' '{print $4}') # 从本地路径转换为Perforce仓库路径(假设local_dir2对应depot_root) depot_file=${local_file2//$local_dir2/$depot_root} differ_status="differ" ;; "Only in"*) # 处理仅存在于某一边的文件,可根据实际需求补充逻辑 continue ;; esac # 提取Perforce提交者用户名 submitter=$(p4 describe -s "$depot_file" | awk '/^User/ {print $2}') # 处理文件不存在于Perforce的情况 if [ -z "$submitter" ]; then submitter="Unknown" fi # 格式化输出到CSV(匹配预期格式) echo -e "Files\t$(basename "$local_file1")\t$(basename "$local_file2")\t$differ_status\t$submitter" >> "$csvfile" done
关键修改说明
- 路径映射:新增
depot_root变量,将本地文件路径替换为Perforce仓库路径,确保p4 describe能找到对应文件。 - 提交者提取优化:仅提取
User行的用户名,避免多余输出。 - CSV格式规范:添加表头,用
echo -e处理制表符,保证列对齐。 - 错误处理:判断提交者为空时填充
Unknown,避免空值。 - 变量引号:所有路径变量添加双引号,兼容含空格的路径。
内容的提问来源于stack exchange,提问作者Ekam
相关产品推荐
相关产品推荐

