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.