Q:为什么要找不同,为什么要打补丁?

A:

  在Linux应用中,作为DBA,我们知道MySQL跑在Linux系统之上,数据库最重要的追求就是性能,“稳”是重中之重,所以不能动不动就是换系统或是换这换那的,这个时候除非是万不得已,要不然都是在原有基础上改改就行了,也就是给内核及下载的一些源码打补丁或者说是升级,那么在Linux下使用diff制作补丁以及如何使用patch打补丁显得尤为重要。

一、找不同:diff命令(differences)

  -- compare files line by line

  一行一行的比较文本文件

作用:

  比较两个文件之间的差异,输出结果为两个文件的不同之处。

  使用diff命令制作补丁。

格式:

diff  [OPTION]...  FILES

选项:

  -u:会将不同的地方放在一起,紧凑易读

    diff -u test1 test2 > test.patch   (利用diff命令生成补丁patch)

  -r:递归比较目录下的所有文件(比较文件夹时候一定要接-r)

1、diff命令:找不同

shell> cp fruit.txt shuiguo.txt
shell> diff fruit.txt shuiguo.txt
  //因为是复制的文件,所以文件内容没有差异,也就没有输出结果 shell> echo "banana" >>fruit.txt
shell> diff fruit.txt shuiguo.txt
9d8
< banana
  //diff命令后面,第一个文件有9行,第二个文件有8行,<表示右边文件内容缺失 shell> echo "cherry" >>shuiguo.txt
shell> diff fruit.txt shuiguo.txt
9c9
< banana
---
> cherry
  //diff命令后面,两个文件都是9行,<右边文件缺失banana,>左边文件缺失cherry

2、diff命令:制作补丁文件

shell> cat ni.txt
jinan
changqing
linux
chinaitsoft
shell> cp ni.txt wo.txt
shell> diff ni.txt wo.txt
shell> diff -u ni.txt wo.txt
  //copy文件没有内容差异

shell> echo "zhangjiacai" >>wo.txt
shell> diff -u ni.txt wo.txt
--- ni.txt -- ::35.253976996 +
+++ wo.txt -- ::50.037971397 +
@@ -, +, @@
changqing
linux
chinaitsoft
+zhangjiacai shell> vim ni.txt
shell> cat ni.txt
jinan
linux
chinaitsoft shell> diff -u ni.txt wo.txt
--- ni.txt -- ::32.930978061 +
+++ wo.txt -- ::50.037971397 +
@@ -, +, @@
jinan
+changqing
linux
chinaitsoft
+zhangjiacai

解析:

  @@ 代表一段范围

  - 代表ni.txt

  + 代表wo.txt

使用 > 输出重定向生成补丁文件ni-to-wo.patch

shell> diff -u ni.txt wo.txt > ni-to-wo.patch
shell> cat ni-to-wo.patch
--- ni.txt -- ::32.930978061 +
+++ wo.txt -- ::50.037971397 +
@@ -, +, @@
jinan
+changqing
linux
chinaitsoft
+zhangjiacai

如此,我们就做好了一个补丁文件。

二、打补丁:patch命令

  --- apply a diff file to an original.

用途:

  用来打补丁---修补文件

格式:

patch  [选项]  原始文件 < 补丁文件

  -pN:N表示忽略N层路径

  -R: 还原到老版本

注意事项:

  ①如果打多个补丁,注意先后顺序;

  ②打补丁前不要修改源文件;

1、文件和文件的比较

shell> diff ni.txt wo.txt
1a2
> changqing
3a5
> zhangjiacai
shell> diff ni.txt wo.txt >ni-to-wo.patch  //生成补丁文件 shell> patch ni.txt <ni-to-wo.patch  //打补丁
patching file ni.txt
shell> diff ni.txt wo.txt  //打补丁成功 shell> patch -R ni.txt <ni-to-wo.patch  //还原到原来的版本(撤销打补丁)
patching file ni.txt shell> diff ni.txt wo.txt
1a2
> changqing
3a5
> zhangjiacai

2、目录和目录的比较

[root@localhost test]# tree qq-v1
qq-v1
├── hosts
└── image
└── .txt [root@localhost test]# tree qq-v2
qq-v2
├── hosts
├── image
│ └── .txt
├── passwd
└── sound
└── .txt [root@localhost test]# diff -ur qq-v1 qq-v2
Only in qq-v2: passwd
Only in qq-v2/sound: .txt [root@localhost test]# diff -Nur qq-v1 qq-v2
diff -Nru qq-v1/passwd qq-v2/passwd
--- qq-v1/passwd -- ::00.000000000 +
+++ qq-v2/passwd -- ::47.664980339 +
@@ -, +, @@
+root:x:::root:/root:/bin/bash
+bin:x:::bin:/bin:/sbin/nologin

解析:

  -N --new-file(Treat absent files as empty)如果没有文件,就拿一个空文件和别的目录里的文件比较

制作补丁文件进行对目录的打补丁

[root@localhost test]# diff -Nur qq-v1 qq-v2 >patch-v2.txt  #比较文件夹生成补丁文件--备用:补丁文件patch-v2.txt在test目录下

-pnum  or  --strip=num

Strip the smallest prefix containing num leading slashes from each file name

found in the patch file.

例如:/a/b/c/d/e/f/g

  -p3 的效果就是去掉第3个/前面的内容,效果:c/d/e/f/g

  -p4 的效果就是去掉第4个/前面的内容,效果:d/e/f/g

1> 内层打补丁

[root@localhost test]# cd qq-v1  #进入qq目录,进去里面进行打补丁
[root@localhost qq-v1]# patch -p1 <../patch-v2.txt
patching file passwd
patching file sound/.txt [root@localhost qq-v1]# cd ..
[root@localhost test]# diff -Nru qq-v1 qq-v2
  //没有输出结果说明打补丁成功 [root@localhost test]# cd qq-v1
[root@localhost qq-v1]# patch -R -p1 <../patch-v2.txt  //撤销补丁
patching file passwd
patching file sound/.txt [root@localhost qq-v1]# cd ..
[root@localhost test]# diff -Nru qq-v1 qq-v2
diff -Nru qq-v1/passwd qq-v2/passwd
--- qq-v1/passwd -- ::00.000000000 +
+++ qq-v2/passwd -- ::47.664980339 +
@@ -, +, @@
+root:x:::root:/root:/bin/bash
+bin:x:::bin:/bin:/sbin/nologin

2> 外层打补丁

//如果qq-v1和qq-v2在相同目录下,就不需要去掉一层路径
[root@localhost test]# patch -p0 <patch-v2.txt
patching file qq-v1/passwd
patching file qq-v1/sound/.txt

墙裂建议:

  任何操作前,记得对文件、目录做好备份,防止操作失败导致数据丢失。

在Linux下的找不同-打补丁的更多相关文章

  1. 奇怪,Linux下find找不到文件了

    你遇到过linux下root用户执行find命令按文件名在根目录下查找不到指定文件的情况吗?如果你遇到这种情况,你分析可能有哪几种原因导致?这里记录一下这个有意思的问题. 问题现象 实现一个工具,需要 ...

  2. .PHP后缀大写导致Linux下Composer找不到类

    在本地Windows写完一个Composer包,上传到Linux报错找不到类,纠结了一下午,最后发现是.PHP后缀大写导致的问题. mv Google2FA.PHP Google2FA.php

  3. day6、Linux下如何找出7天以前的文件删除

    有些时候,由于系统产生的日志文件,使服务器的磁盘空间紧张,所以怎么删除7天以前的日志文件及让系统只保留7天以内的日志文件 方法一 使用命令:find + |xargs + ls 命令方法:find / ...

  4. Aspose Linux下字体找不到报错

    http://www.aspose.com/docs/display/cellsnet/Smart+Markers http://www.aspose.com/docs/display/cellsja ...

  5. linux下如何找出交叉编译器的某个库路径?

    答: 使用选项-print-file-name=<lib_name> 如列出libstdc++.so.6的库路径:aarch64-linux-gnu-gcc -print-file-nam ...

  6. Linux下sed找出IP中第四位

    ip addr|sed -n '9p'|egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'|sed -nr 's#^.*inet (.*) b ...

  7. android和Linux下getopt的差别

    1. Linux下如果找不到相对应的参数,则会跳过继续找下一个 Android下如果找不到则会直接返回-1,跳出来 2. Linux下通过getopt后会把找到的元素放到数组的前面,没找到的往后移动( ...

  8. Java - 问题集 - linux下,jar: command not found

    linux下的找不到jar命令解决方法如下: 1. 确认jdk是否已安装 2. 检查jdk环境变量是否已设置,并且确认该设置已生效 3. 1,2两步均正常时,建立jar的软链接 # cd /usr/b ...

  9. linux 下安装及查看java的安装路径

    一.Linux下安装JDK 1.下载文件 从官网下载合适版本如:jdk-8u191-linux-x64.tar.gz 2.安装文件 1.在 /usr/ 目录下创建 java文件夹mkdir /usr/ ...

随机推荐

  1. Weblogic虚拟目录

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...

  2. 提高 webpack 构建 Vue 项目的速度

    前言 最近有人给我的 Vue2 后台管理系统解决方案 提了 issue ,说执行 npm run build 构建项目的时候极其慢,然后就引起我的注意了.在项目中,引入了比较多的第三方库,导致项目大, ...

  3. 老李分享:《Linux Shell脚本攻略》 要点(八)

    老李分享:<Linux Shell脚本攻略> 要点(八)   1.打印进程 [root@localhost program_test]# ps -e | head  PID TTY     ...

  4. Mac系统-java环境搭建_01

    一.安装jdk 下载地址:http://www.oracle.com/technetwork/Java/javase/downloads/index-jsp-138363.html 1.傻瓜式安装下一 ...

  5. AngularJS1.X学习笔记14-动画(解读文档)

    最近在看算法分析,那个大O啊,小o啊,分治法啊(目前就看到这里),真是搞死了.这回呢休息一下,学学AngularJS动画,上一篇文章根据自由男人的书简单谈到了动画的话题,发现反响很大(好吧,我说慌了, ...

  6. 如何选择合适的PHP开发框架

    PHP作为一门成熟的WEB应用开发语言,已经深受广大开发者的青睐.与此同时,各式各样的PHP开发框架也从出不穷,面对如此多而且良莠不齐的开发框架,开发者们想必都会眼花缭乱,不知道该选择用哪个.其实并没 ...

  7. 初识bd时的一些技能小贴士

    既然小豆腐如此给力,而且充分的利用主动学习的优势,已经有了迅速脑补,压倒式的优势,不过这只是表面而已,一切才刚刚开始,究竟鹿死谁手,还有待验证. 以上可以看到,小豆腐为什么拼命的要teach我们了么, ...

  8. 【转载】rem自适应布局-移动端自适应必备

    原文链接:rem自适应布局-移动端自适应必备 版权所有,转载时请注明出处,违者必究. 由于移动端特殊性,本文讲的是如何使用rem实现自适应,或叫rem响应式布局,通过使用一个脚本就可以rem自适应,不 ...

  9. .net core 利用中间件处理常见的网站功能 包括 session、routers、重定向、重写和文件下载

    在.net core中所有的请求都会被请求中间件所处理,所以我们可以通过在中间件里边添加对应的功能然后在服务中添加注入来实现对应的功能 文件位置:Startup.cs=>Configure方法, ...

  10. html运用以及工具

    对于这个教程,我建议你只使用最简单的工具.例如:Notepad(在windows里),TextEdit(在Mac上)或是KEdit(在KDE里)就可以了.一旦你了解这个原理,你就会想要切换到更高级的工 ...