在Linux下的找不同-打补丁
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下的找不同-打补丁的更多相关文章
- 奇怪,Linux下find找不到文件了
你遇到过linux下root用户执行find命令按文件名在根目录下查找不到指定文件的情况吗?如果你遇到这种情况,你分析可能有哪几种原因导致?这里记录一下这个有意思的问题. 问题现象 实现一个工具,需要 ...
- .PHP后缀大写导致Linux下Composer找不到类
在本地Windows写完一个Composer包,上传到Linux报错找不到类,纠结了一下午,最后发现是.PHP后缀大写导致的问题. mv Google2FA.PHP Google2FA.php
- day6、Linux下如何找出7天以前的文件删除
有些时候,由于系统产生的日志文件,使服务器的磁盘空间紧张,所以怎么删除7天以前的日志文件及让系统只保留7天以内的日志文件 方法一 使用命令:find + |xargs + ls 命令方法:find / ...
- Aspose Linux下字体找不到报错
http://www.aspose.com/docs/display/cellsnet/Smart+Markers http://www.aspose.com/docs/display/cellsja ...
- linux下如何找出交叉编译器的某个库路径?
答: 使用选项-print-file-name=<lib_name> 如列出libstdc++.so.6的库路径:aarch64-linux-gnu-gcc -print-file-nam ...
- 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 ...
- android和Linux下getopt的差别
1. Linux下如果找不到相对应的参数,则会跳过继续找下一个 Android下如果找不到则会直接返回-1,跳出来 2. Linux下通过getopt后会把找到的元素放到数组的前面,没找到的往后移动( ...
- Java - 问题集 - linux下,jar: command not found
linux下的找不到jar命令解决方法如下: 1. 确认jdk是否已安装 2. 检查jdk环境变量是否已设置,并且确认该设置已生效 3. 1,2两步均正常时,建立jar的软链接 # cd /usr/b ...
- linux 下安装及查看java的安装路径
一.Linux下安装JDK 1.下载文件 从官网下载合适版本如:jdk-8u191-linux-x64.tar.gz 2.安装文件 1.在 /usr/ 目录下创建 java文件夹mkdir /usr/ ...
随机推荐
- 01.Nodejs入门之Helloworld
说明:本文章可供有一定js基础的朋友参考nodejs入门,本文未讲解nodejs的安装,如有需要的同学可以加QQ3382260752找我,进行交流学习. 1.新建文件夹helloworld demo, ...
- Visual Studio 2017创建.net standard类库编译出错原因
正式版上个月已经Release了,从那时到现在经常会收到更新提示,估计问题还不少吧!其中最吸引我的当然是.net standard与.net core. 刚好最近接触.net standard项目,新 ...
- java实现截屏
import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit ...
- 取消putty右键粘贴功能
还是非常喜欢putty的.就是右键默认的粘贴功能比较讨人厌.
- Sphinx安装流程及配合PHP使用经验
1.什么是Sphinx Sphinx是俄罗斯人Andrew Aksyonoff开发的高性能全文搜索软件包,在GPL与商业协议双许可协议下发行. 全文检索式指以文档的全部文本信息作为检索对象的一种信息检 ...
- python_原始_web框架
创:10_4_2017 修: 什么是web框架? -- 本质上是socket,用户请求来,业务逻辑处理,返回处理结果 -- 包含socket或者不包含socket的框架 什么是wsgi? -- web ...
- Java中常用来处理时间的三个类:Date、Calendar、SimpleDateFormate,以及Java中的单例设计模式:懒汉式、饿汉式以及静态内部类式
(一)java.util.Date类 1.该类有一个long类型的属性:用来存放时间,是用毫秒数的形式表示,开始的日期是从1970年1月1号 00:00:00. 2.该类的很多方法都已经过时,不 ...
- Java NIO之Buffers
一.前言 在笔者打算学习Netty框架时,发现很有必要先学习NIO,因此便有了本博文,首先介绍的是NIO中的缓冲. 二.缓冲 2.1 层次结构图 除了布尔类型外,其他基本类型都有相对应的缓冲区类,其继 ...
- struts2 之 ThreadLocal 和 ActionContext
1. ThreadLocal:该类提供了线程局部(thtead-local)变量.threadLocal是一个容器,该容器中存放的数据可以保证线程安全. 案例如: public class Threa ...
- T-SQL编程语句
书接上回 一起学习下SQL中的表连接 一般情况下咱们会使用鼠标去进行表连接操作,那针对于像我比较懒的并且眼盲的,不喜欢来回切换,咱们就用到了点T-SQL表连接语句 一般情况咱们从两个表中查出来相似的内 ...