常用命令--patch

Linux 系统中可以使用 diff 命令对比出新旧软件的不同,并生成补丁文件。

diff 命令基本格式

#比较old和new文件的不同
[root@localhost ~]# diff 选项 old new

此命令中可使用如下几个选项:

  -a:将任何文档当作文本文档处理;
  -b:忽略空格造成的不同;
  -B:忽略空白行造成的不同;
  -I:忽略大小写造成的不同;
  -N:当比较两个目录时,如果某个文件只在一个目录中,则在另一个目录中视作空文件;
  -r:当比较目录时,递归比较子目录;
  -u:使用同一输出格式;

生成补丁文件

创建两个文件,执行如下命令

mkdir test
cd test
cat <<EOF > old.txt
our
school
is
lampbrother
#文件old.txt,为了便于比较,将每行分开
EOF
cat <<EOF >new.txt
our
school
is
lampbrother
in
Beijing
#文件new.txt
EOF

利用 diff 命令,比较两个文件(old.txt 和 new.txt)的不同,并生成补丁文件(test.patch),执行代码如下:

diff -Naur /root/test/old.txt /root/test/new.txt > test.patch

 给 old.txt 文件打补丁

利用补丁文件 txt.patch 更新 old.txt 旧文件,实现此步操作需利用 patch 命令,该命令基本格式如下:

[root@localhost test]# patch -pn < 补丁文件
按照补丁文件进行更新

-pn 选项中,n 为数字(例如 p1、p2、p3 等),pn 表示按照补丁文件中的路径,指定更新文件的位置。

我们知道,补丁文件是要打入旧文件的,但是当前所在目录和补丁文件中记录的目录不一定是匹配的,需要 "-pn" 选项来同步两个目录。例如,当前位于 "/root/test/" 目录下(要打补丁的旧文件就在当前目录下),补丁文件中记录的文件目录为 "/root/test/dd.txt",如果写入 "-p1"(在补丁文件目录中取消一级目录),那么补丁文件会打入 "root/test/root/test/old.txt" 文件中,这显然是不对的;如果写入的是 "-p2"(在补丁文件目录中取消二级目录),补丁文件会打入 "/root/test/test/old.txt" 文件中,这显然也不对。如果写入的是 "-p3"(在补丁文件目录中取消三级目录),补丁文件会打入 "/root/test/old.txt" 文件中,old.txt 文件就在这个目录下,所以应该用 "-p3" 选项。

现在更新 "old.txt" 文件,命令如下:

patch -p3 < test.patch

如果当前所在目录是 "/root/" 目录呢?因为补丁文件中记录的文件目录为 "/root/test/old.txt",所以这里就应该用 "-p2" 选项(代表取消两级目录),补丁打在当前目录下的 "test/old.txt" 文件上。因此,-pn 选项可以这样理解,即想要在补丁文件中所记录的目录中取消几个 "/",n 就是几。去掉目录的目的是和当前所在目录匹配。

可以看到,通过使用补丁文件 txt.patch 对旧文件进行更新,使得旧文件和新文件完全相同。

给旧文件打补丁依赖的不是新文件,而是补丁文件,所以即使新文件被删除也没有关系。

补丁文件中记录的目录和当前所在目录需要通过 "-pn" 选项实现同步,否则更新可能失败。


作者:Outsrkem
出处:https://www.cnblogs.com/outsrkem/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/outsrkem/p/13416372.html