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
< 8.
3a3
> 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.
Categories: Code

Yu

Ideals are like the stars: we never reach them, but like the mariners of the sea, we chart our course by them.

Leave a Reply

Your email address will not be published. Required fields are marked *