ohos-diffutils 是为 OpenHarmony 平台编译的 GNU diffutils 工具集。本文档详细介绍如何在鸿蒙PC上安装和使用官方适配完成的 diffutils 工具,包括 HNP 包的打包、安装和使用方法。
📋 目录
一、项目概述
1.1 diffutils 工具简介
diffutils 是 GNU 项目提供的文件对比工具集,包含 diff、cmp、diff3 和 sdiff 等工具。这些工具用于比较文件之间的差异,是版本控制、代码审查和文件管理的重要工具。
核心工具:
- 📊 diff:逐行比较两个文件,显示差异
- 🔍 cmp:逐字节比较两个文件,显示第一个差异位置
- 📝 diff3:比较三个文件,显示合并冲突
- 📋 sdiff:并排显示两个文件的差异
核心特性:
- 🔎 精确比较:逐行或逐字节比较文件内容
- 📝 多种格式:支持统一格式、上下文格式、并排格式等
- ⚡ 高效算法:使用优化的算法快速比较大文件
- 🎯 灵活输出:支持多种输出格式和选项
- 🔧 目录比较:支持递归比较目录结构
主要应用场景:
- 代码版本对比和差异分析
- 配置文件变更检查
- 文件同步和备份验证
- 代码审查和合并冲突解决
- 自动化测试和回归测试

1.2 项目信息
| 项目信息 | 详情 |
|---|---|
| 项目名称 | ohos-diffutils |
| 版本 | 最新版本(GNU diffutils 官方版本) |
| 许可证 | GPL-3.0 |
| 目标平台 | 鸿蒙PC (aarch64-linux-ohos) |
| 源码仓库 | https://git.savannah.gnu.org/git/diffutils.git |
| 适配仓库 | https://github.com/Harmonybrew/ohos-diffutils |
| 预构建包 | https://github.com/Harmonybrew/ohos-diffutils/releases |
| 编译方式 | 交叉编译(Cross Compilation) |
1.3 diffutils 工具详解
diff 命令
diff 是最常用的文件比较工具,可以逐行比较两个文件并显示差异。
主要功能:
- 比较两个文件或目录
- 显示添加、删除、修改的行
- 支持多种输出格式(统一格式、上下文格式等)
- 生成补丁文件
cmp 命令
cmp 逐字节比较两个文件,显示第一个差异的位置。
主要功能:
- 快速检测文件是否相同
- 显示第一个差异的字节位置
- 适合二进制文件比较
diff3 命令
diff3 比较三个文件,用于合并场景。
主要功能:
- 比较三个文件(原始文件、文件A、文件B)
- 显示合并冲突
- 生成合并结果
sdiff 命令
sdiff 并排显示两个文件的差异。
主要功能:
- 并排显示两个文件
- 标记差异行
- 交互式合并选项
1.4 为什么需要 ohos-diffutils?
在鸿蒙PC上进行开发时,我们经常需要:
- ✅ 代码对比:比较不同版本的代码文件
- ✅ 配置管理:检查配置文件的变更
- ✅ 版本控制:生成和应用补丁文件
- ✅ 代码审查:查看代码修改内容
- ✅ 自动化测试:验证文件是否按预期修改
二、为什么需要 HNP 包
2.1 系统安全限制
重要说明: 在鸿蒙PC上,由于系统安全规格限制等原因,暂不支持通过"解压 + 配 PATH"的方式直接使用 tar.gz 包。
这意味着:
- ❌ 不能直接解压 tar.gz 包到任意目录
- ❌ 不能通过设置 PATH 环境变量来使用
- ✅ 必须打包成 HNP(HarmonyOS Native Package)格式才能正常使用
2.2 HNP 包的优势
HNP 包是鸿蒙PC的官方包管理格式,具有以下优势:
- ✅ 系统集成:与鸿蒙PC的包管理系统集成
- ✅ 安全可靠:通过官方工具安装,符合系统安全规范
- ✅ 易于管理:支持安装、卸载、更新等操作
- ✅ 路径规范:统一安装在
/data/service/hnp/目录下
2.3 其他平台的使用方式
在鸿蒙开发板上:
可以使用传统的"解压 + 配 PATH"方式:
# 使用 hdc 推送文件到设备
hdc file send diffutils-*-ohos-arm64.tar.gz /data
# 进入设备 shell
hdc shell
# 解压并配置
cd /data
tar -zxf diffutils-*-ohos-arm64.tar.gz
export PATH=$PATH:/data/diffutils-*-ohos-arm64/bin
三、HNP 包打包方法
3.1 准备工作
在开始打包之前,需要准备以下内容:
- 预构建的 tar.gz 包:从 release 页面 下载
- hnpcli 工具:鸿蒙PC的包管理工具
- 打包脚本:用于自动化打包过程
3.2 下载预构建包
# 下载 diffutils 预构建包
wget https://github.com/Harmonybrew/ohos-diffutils/releases/download/latest/diffutils-*-ohos-arm64.tar.gz
3.3 创建打包脚本
创建一个 pack_hnp.sh 脚本来自动化打包过程:
#!/bin/bash
set -e
# 配置变量
DIFFUTILS_VERSION="3.10" # 根据实际版本调整
TAR_FILE="diffutils-${DIFFUTILS_VERSION}-ohos-arm64.tar.gz"
EXTRACT_DIR="diffutils-${DIFFUTILS_VERSION}-ohos-arm64"
HNP_PUBLIC_PATH="/data/service/hnp"
DIFFUTILS_INSTALL_PATH="${HNP_PUBLIC_PATH}/diffutils.org/diffutils_${DIFFUTILS_VERSION}"
OUTPUT_DIR="output"
WORKDIR=$(pwd)
# 创建输出目录
mkdir -p ${OUTPUT_DIR}
# 解压 tar.gz 包
if [ ! -d "${EXTRACT_DIR}" ]; then
echo "解压 ${TAR_FILE}..."
tar -zxf ${TAR_FILE}
fi
# 创建安装目录
echo "创建安装目录..."
mkdir -p ${DIFFUTILS_INSTALL_PATH}/bin
# 复制文件
echo "复制文件..."
cp -r ${EXTRACT_DIR}/bin/* ${DIFFUTILS_INSTALL_PATH}/bin/
if [ -f "${EXTRACT_DIR}/COPYING" ]; then
cp ${EXTRACT_DIR}/COPYING ${DIFFUTILS_INSTALL_PATH}/
fi
if [ -f "${EXTRACT_DIR}/AUTHORS" ]; then
cp ${EXTRACT_DIR}/AUTHORS ${DIFFUTILS_INSTALL_PATH}/
fi
# 创建 hnp.json
echo "创建 hnp.json..."
cat > ${DIFFUTILS_INSTALL_PATH}/hnp.json << 'EOF'
{
"type": "hnp-config",
"name": "diffutils",
"version": "3.10",
"install": {
"links": [
{
"source": "bin/diff",
"target": "diff"
},
{
"source": "bin/cmp",
"target": "cmp"
},
{
"source": "bin/diff3",
"target": "diff3"
},
{
"source": "bin/sdiff",
"target": "sdiff"
}
]
}
}
EOF
# 设置执行权限
chmod +x ${DIFFUTILS_INSTALL_PATH}/bin/*
# 使用 hnpcli 打包(如果可用)
if command -v hnpcli &> /dev/null; then
echo "使用 hnpcli 打包..."
hnpcli pack -i ${DIFFUTILS_INSTALL_PATH} -o ${OUTPUT_DIR}/
echo "HNP 包已生成: ${OUTPUT_DIR}/diffutils.hnp"
else
echo "警告: 未找到 hnpcli 工具,跳过 HNP 包生成"
echo "请手动使用 hnpcli 打包:"
echo " hnpcli pack -i ${DIFFUTILS_INSTALL_PATH} -o ${OUTPUT_DIR}/"
fi
# 生成 tar.gz 包(备用)
echo "生成 tar.gz 包..."
cd ${HNP_PUBLIC_PATH}/diffutils.org
tar -zcf ${WORKDIR}/${OUTPUT_DIR}/ohos_diffutils_${DIFFUTILS_VERSION}.tar.gz diffutils_${DIFFUTILS_VERSION}/
cd - > /dev/null
echo "打包完成!"
echo "输出文件:"
echo " - ${OUTPUT_DIR}/diffutils.hnp (如果 hnpcli 可用)"
echo " - ${OUTPUT_DIR}/ohos_diffutils_${DIFFUTILS_VERSION}.tar.gz"
3.4 执行打包
# 赋予脚本执行权限
chmod +x pack_hnp.sh
# 执行打包
./pack_hnp.sh
3.5 验证打包结果
打包完成后,验证生成的文件:
# 检查 HNP 包
ls -lh output/diffutils.hnp
# 检查 tar.gz 包
ls -lh output/ohos_diffutils_*.tar.gz
# 验证安装目录结构
tree ${DIFFUTILS_INSTALL_PATH}/
预期的安装目录结构:
/data/service/hnp/diffutils.org/diffutils_3.10/
├── bin/
│ ├── diff # diff 可执行文件
│ ├── cmp # cmp 可执行文件
│ ├── diff3 # diff3 可执行文件
│ └── sdiff # sdiff 可执行文件
├── COPYING # 许可证文件
├── AUTHORS # 作者信息
└── hnp.json # HNP 配置文件
四、安装与使用
4.1 安装 HNP 包
手动安装(使用 tar.gz)
# 在鸿蒙PC上执行
# 1. 解压 tar.gz 包
tar -xzf ohos_diffutils_*.tar.gz
# 2. 复制到安装目录
sudo cp -r diffutils_*/* /data/service/hnp/diffutils.org/diffutils_*/
# 3. 设置执行权限
sudo chmod +x /data/service/hnp/diffutils.org/diffutils_*/bin/*
# 4. 创建符号链接(根据 hnp.json 配置)
# hnp 系统会自动处理 links 配置
4.2 验证安装
# 检查 diff 是否可用
diff --version
# 检查 cmp 是否可用
cmp --version
# 检查 diff3 是否可用
diff3 --version
# 检查 sdiff 是否可用
sdiff --version
4.3 使用 diffutils
安装完成后,就可以使用 diff、cmp、diff3 和 sdiff 命令了。
五、使用示例
5.1 diff 命令示例
基本比较
# 比较两个文件
diff file1.txt file2.txt
# 比较并显示上下文(3行)
diff -c file1.txt file2.txt
# 比较并显示统一格式
diff -u file1.txt file2.txt
# 忽略空白差异
diff -b file1.txt file2.txt
# 忽略大小写
diff -i file1.txt file2.txt
目录比较
# 递归比较两个目录
diff -r dir1/ dir2/
# 递归比较并显示统一格式
diff -ru dir1/ dir2/
# 只显示文件名差异
diff -rq dir1/ dir2/
生成补丁文件
# 生成统一格式补丁
diff -u original.txt modified.txt > patch.txt
# 应用补丁
patch original.txt < patch.txt
# 生成目录补丁
diff -ru original_dir/ modified_dir/ > patch.diff
高级选项
# 显示行号
diff -u -n file1.txt file2.txt
# 忽略空行
diff -B file1.txt file2.txt
# 忽略所有空白
diff -w file1.txt file2.txt
# 显示并排格式
diff -y file1.txt file2.txt
5.2 cmp 命令示例
基本比较
# 比较两个文件
cmp file1.txt file2.txt
# 显示第一个差异的字节位置
cmp -b file1.txt file2.txt
# 显示所有差异
cmp -l file1.txt file2.txt
# 只显示是否相同(退出码)
cmp -s file1.txt file2.txt
echo $? # 0=相同, 1=不同
二进制文件比较
# 比较二进制文件
cmp binary1.bin binary2.bin
# 显示差异的十六进制
cmp -l binary1.bin binary2.bin | head -20
5.3 diff3 命令示例
三路比较
# 比较三个文件(原始、文件A、文件B)
diff3 original.txt fileA.txt fileB.txt
# 显示合并格式
diff3 -m original.txt fileA.txt fileB.txt > merged.txt
# 显示编辑脚本
diff3 -e original.txt fileA.txt fileB.txt
解决合并冲突
# 生成合并结果
diff3 -m original.txt fileA.txt fileB.txt > merged.txt
# 查看冲突标记
grep -n "<<<<<<< \|======= \|>>>>>>> " merged.txt
5.4 sdiff 命令示例
并排显示
# 并排显示两个文件
sdiff file1.txt file2.txt
# 显示宽格式(130列)
sdiff -w 130 file1.txt file2.txt
# 只显示差异行
sdiff -s file1.txt file2.txt
交互式合并
# 交互式合并选项
sdiff -o merged.txt file1.txt file2.txt
# 合并选项:
# ed - 编辑差异
# eb - 编辑两个文件
# el - 使用左侧文件
# er - 使用右侧文件
# e - 编辑新版本
5.5 实际应用场景
代码版本对比
# 比较两个版本的代码文件
diff -u old_version.c new_version.c
# 生成补丁文件
diff -u old_version.c new_version.c > changes.patch
# 应用补丁
patch old_version.c < changes.patch
配置文件管理
# 比较配置文件
diff -u /etc/config.old /etc/config.new
# 备份并应用新配置
cp /etc/config /etc/config.backup
diff -u /etc/config.backup /etc/config.new > config.patch
patch /etc/config < config.patch
目录同步检查
# 检查两个目录是否同步
diff -rq source_dir/ backup_dir/
# 生成同步补丁
diff -ru source_dir/ backup_dir/ > sync.patch
自动化测试
# 验证输出文件是否匹配预期
diff -q output.txt expected.txt && echo "Test passed" || echo "Test failed"
# 在脚本中使用
if diff -q file1.txt file2.txt > /dev/null; then
echo "Files are identical"
else
echo "Files differ"
fi
六、常见问题
6.1 diff 输出格式看不懂?
问题: diff 的默认输出格式不够直观。
解决方案:
使用统一格式(unified format):
# 使用 -u 选项显示统一格式
diff -u file1.txt file2.txt
# 使用 -c 选项显示上下文格式
diff -c file1.txt file2.txt
# 使用 -y 选项并排显示
diff -y file1.txt file2.txt
6.2 如何忽略空白差异?
问题: 只想比较实际内容,忽略空白字符的差异。
解决方案:
# 忽略行尾空白
diff -b file1.txt file2.txt
# 忽略所有空白
diff -w file1.txt file2.txt
# 忽略空行
diff -B file1.txt file2.txt
# 组合使用
diff -wB file1.txt file2.txt
6.3 如何比较二进制文件?
问题: 需要比较二进制文件或检测文件是否相同。
解决方案:
使用 cmp 命令:
# 快速检测是否相同
cmp -s file1.bin file2.bin && echo "Same" || echo "Different"
# 显示第一个差异位置
cmp -b file1.bin file2.bin
# 显示所有差异
cmp -l file1.bin file2.bin
6.4 如何解决合并冲突?
问题: 使用 diff3 比较三个文件时,如何解决冲突。
解决方案:
# 生成合并结果
diff3 -m original.txt fileA.txt fileB.txt > merged.txt
# 手动编辑 merged.txt 解决冲突
# 冲突标记:
# <<<<<<< fileA.txt
# ... fileA 的内容 ...
# =======
# ... fileB 的内容 ...
# >>>>>>> fileB.txt
6.5 diff 比较大文件很慢?
问题: 比较大文件时,diff 执行很慢。
解决方案:
-
使用 cmp 快速检测(如果只需要知道是否相同):
cmp -s large1.txt large2.txt -
限制比较范围:
# 只比较前1000行 head -1000 file1.txt > temp1.txt head -1000 file2.txt > temp2.txt diff temp1.txt temp2.txt -
使用并行处理(如果比较多个文件对):
# 使用 xargs 并行处理 find . -name "*.txt" | xargs -P 4 -I {} diff {} {}.bak
6.6 如何从源码构建 diffutils?
参考项目的构建脚本和文档:
# 1. 准备构建环境
sudo apt update && sudo apt install -y build-essential autoconf automake
# 2. 下载源码
git clone https://github.com/Harmonybrew/ohos-diffutils.git
cd ohos-diffutils
# 3. 配置和编译
./configure --host=aarch64-unknown-linux-ohos
make
# 4. 安装
make install
七、总结与最佳实践
7.1 总结
diffutils 是强大的文件对比工具集,为鸿蒙PC提供了完整的文件比较和差异分析能力:
- ✅ 功能全面:diff、cmp、diff3、sdiff 四个工具覆盖各种比较需求
- ✅ 格式多样:支持多种输出格式,适应不同场景
- ✅ 高效算法:优化的算法快速处理大文件
- ✅ 标准兼容:完全符合 POSIX 标准
7.2 最佳实践
-
选择合适的工具:
- 文本文件比较使用
diff - 快速检测文件是否相同使用
cmp - 三路合并使用
diff3 - 并排查看使用
sdiff
- 文本文件比较使用
-
使用合适的格式:
- 生成补丁使用统一格式(
-u) - 查看差异使用上下文格式(
-c) - 直观查看使用并排格式(
-y)
- 生成补丁使用统一格式(
-
忽略无关差异:
- 使用
-w忽略空白 - 使用
-B忽略空行 - 使用
-i忽略大小写
- 使用
-
生成和应用补丁:
- 使用
diff -u生成补丁 - 使用
patch应用补丁 - 保留原始文件备份
- 使用
-
自动化脚本:
- 使用退出码判断文件是否相同
- 结合 find 和 xargs 批量比较
- 在 CI/CD 中使用 diff 验证输出
7.3 适用场景
diffutils 特别适合以下场景:
- ✅ 版本控制:代码版本对比和补丁生成
- ✅ 代码审查:查看代码修改内容
- ✅ 配置管理:配置文件变更检查
- ✅ 文件同步:验证文件是否同步
- ✅ 自动化测试:验证输出是否匹配预期
1468

被折叠的 条评论
为什么被折叠?



