linux patch和diff命令应用和创建补丁

 patch和diff命介绍:

  • diff 命令:用于比较两个文件的差异( 如 a.txt 和修改之后的 a.txt )
    • -u: 生成统一格式的差异输出,通常用于生成补丁文件。
    • -p: 在差异输出中显示更多的上下文信息,以方便阅读。
    • -r: 对目录进行递归比较,而不仅仅比较单个文件。
    • -N: 当比较的文件是空文件时,也显示差异信息。
  • patch命令:通过读取一个补丁文件将一个文件的修改应用到另一个文件
    • -p或--strip:             删除文件名前面的目录
    • -R或--reverse:           反转补丁
    • -N或--forward:           忽略已经应用的补丁
    • -l或--ignore-whitespace: 忽略空白字符的更改

  

基础应用:

  • 现在有 a.txt 内容为: aaaa2.txt 内容为 aaa98
    • 此时为 a.txt 打补丁:diff -u a.txt a2.txt > a.patch
       --- a.txt	2024-07-23 15:22:41.247579543 +0800
      +++ a2.txt	2024-07-23 15:05:50.248737100 +0800
      @@ -1 +1 @@
      -aaa
      \ No newline at end of file
      +aaa98
      \ No newline at end of file
      
      # 以上信息表示 要把 a.txt 里的内容修改为 a2.txt,  --- a.txt  +++ a2.txt
    • 运行 a.patch : patch -p0 < a.patch 此时会根据 a.patch 里面记载的内容修改 a.txt
    • 运行完成后查看 a.txt , 此时 a.txt 为 aaa98
  • 现在有 a.txt 内容为: aaaa2.txt 内容为 aaa98
    • 此时为 a2.txt 打补丁:diff -u a2.txt a.txt > a2.patch
      --- a2.txt	2024-07-23 15:05:50.248737100 +0800
      +++ a.txt	2024-07-23 15:06:01.184657433 +0800
      @@ -1 +1 @@
      -aaa98
      \ No newline at end of file
      +aaa
      \ No newline at end of file
      
      # 以上表示修改 a2.txt 为 a.txt
    • 运行 a2.patch: patch -p0 < a2.patch 有提示 Reversed (or previously applied) patch detected! Assume -R? [n]
      $ patch -p0 < a2.patch 
      patching file a.txt
      Reversed (or previously applied) patch detected!  Assume -R? [n]    # 检测到反向(或以前应用的)补丁!假设-R?n , 
      # 意思是它检测到 a2.patch 里面记录的是根据 a.txt 修改 a2.txt , 但是它发现a2.txt 已经包含了 a.txt, 
      # 需要补丁的是 a.txt 才对, 就问要不要反向去修改 a.txt, 此时输入 -y 就直接把 a.txt 里的内容修改为 aaa98, a2.txt不变
      # 如果输入其它的会生成 中间文件
    • 按提示输入y, 运行完成后查看 a.txt , 此时 a.txt 为 aaa98, 同时会生成 a.txt.orig, 里面的内容就是修改之前的内容,即 aaa

 

patch -p 参数基础应用:

  • 现在有 t0/a.txt 内容为: aaat0/a2.txt 内容为 aaa98
    • 此时为 t0/a.txt 打补丁:diff -u t0/a.txt t0/a2.txt > a_.patc
      a_.patch:
      --- t0/a.txt	2024-07-23 16:03:14.978777574 +0800
      +++ t0/a2.txt	2024-07-23 16:02:21.979817653 +0800
      @@ -1 +1 @@
      -aaa
      \ No newline at end of file
      +aaa98
      \ No newline at end of file
    • 运行补丁:patch -p0 < a_.patch 发现 t0/a.txt 里面的内容确实变成 aaa98 了,说明补丁运行成功
      $ patch -p0 < a_.patch 
      patching file t0/a.txt
      
      # 发现 t0/a.txt 里面的内容确实变成 aaa98 了,说明补丁运行成功
    • 接着我移动 a_.patch 文件到 t0 目录,并进入 t0 目录: mv a_.patch t0/ ; cd t0/ ; patch -p0 < a_.patch 此时就报错找不到 t0/a.txt, t0/a2.txt 了,因为现在已经在 t0 目录了, 而且 t0 目录下没有 t0\a.txt 文件了。此时怎么把 a_.patch 里记录的 t0/a.txt 改为 a.txt 呢?运行 patch -p1 < a_.patch即可,-p1 表示删除一层目录,这里就是把 t0\ 删除了
posted @ 2024-07-23 15:33  封兴旺  阅读(480)  评论(0)    收藏  举报

联系方式: 18274305123(微信同号)