diff 和 patch 的使用

linux 下,我们有时候会想要给某个文件打 patch。若不使用 git 等工具，利用 linux 现成的工具，我们也能很容易搞定。

首先假定我们需要文件如下：

5.
4.
3.
2.
1.
0.

现在我们有文件如下

5.
8.
4.
2.
0.

因为文件很规律，我们可以程序生成一个

$ i=5; while [ $i -ge 0 ]; do echo $i;i=$(($i-1));done | xargs -n 1 -I{} sh -c 'echo {}.'
5.
4.
3.
2.
1.
0.

我们肉眼可以看到，两者之间是有区别的。我们可以生成一个 diff 看看。

$ i=5; while [ $i -ge 0 ]; do echo $i;i=$(($i-1));done | xargs -n 1 -I{} sh -c 'echo {}.' | diff orig.txt -
2d1
3.
4a5
> 1.

diff 后面有两个参数，你可以

diff FILE-OLD FILE-NEW
diff DIR-OLD DIR-NEW

等等各种形式，其中若 FILE 或者 DIR 为 – 则表示该栏位为 stdin。你可以用参数 –help 查看更多说明。

然后可以输出一个 diff 文件。

如前面那个命令，它的-OLD 是 orig.txt, -NEW 是 stdin，因为 pipeline，其实就是上一个 sh 的 stdout。

我们可以查看 diff 的内容，大致就是，若从左边变成右边，需要去掉第二行的 8.， 增加3. 和 1.

我们可以把这个 stdout 写到一个patch file里去：

$ i=5; while [ $i -ge 0 ]; do echo $i;i=$(($i-1));done | xargs -n 1 -I{} sh -c 'echo {}.' | diff orig.txt - > orig.txt.patch

现在我们有 orig.txt 和 orig.txt.patch, 我们怎样更新这个 orig.txt 呢？ 另一个命令 patch 也很容易。

$ patch orig.txt orig.txt.patch
patching file orig.txt

然后查看效果如下：

$ cat orig.txt
5.
4.
3.
2.
1.
0.