首页 > 代码库 > diff与patch的简单用法

diff与patch的简单用法

diff

比较相似文件的差异(以行为单位),还可以生成用以更新的“补丁文件”

及指定目录下文件名的不同





diff比较两个目录下文件名的不一致

[root@localhost tmp]# ls aaaa

my.cnf

[root@localhost tmp]# ls bbbb

myy.cnf

[root@localhost tmp]# ls

aaaa  bbbb  my.cnf  myyy.cnf

[root@localhost tmp]# diff aaaa bbbb

Nur in aaaa: my.cnf.

Nur in bbbb: myy.cnf.

运行结果提示出了不同的文件名,安装的vagrant默认不知是哪里的语言,还没修改过来,了解意思就好。。。




[root@localhost tmp]# cat -n my.cnf

     1  [mysqld]

     2  datadir=/var/lib/mysql

     3  socket=/var/lib/mysql/mysql.sock

     4  # Disabling symbolic-links is recommended to prevent assorted security risks

     5  symbolic-links=0

     6  # Settings user and group are ignored when systemd is used.

     7  # If you need to run mysqld under a different user or group,

     8  # customize your systemd unit file for mariadb according to the

     9  # instructions in http://fedoraproject.org/wiki/Systemd

    10

    11  [mysqld_safe]

    12  log-error=/var/log/mariadb/mariadb.log

    13  pid-file=/var/run/mariadb/mariadb.pid

    14

    15  #

    16  # include all files from the config directory

    17  #

    18  !includedir /etc/my.cnf.d

    19

[root@localhost tmp]# cp my.cnf  mmmm.cnf

[root@localhost tmp]# diff my.cnf  mmmm.cnf

相同内容的文件,运行diff比较之后没有输出。

[root@localhost tmp]# cat my.cnf | sed -e ‘4d‘ -e ‘6c this line was replaced!‘ >myyy.cnf

[root@localhost tmp]# cat -n myyy.cnf

     1  [mysqld]

     2  datadir=/var/lib/mysql

     3  socket=/var/lib/mysql/mysql.sock

     4  symbolic-links=0

     5  this line was replaced!

     6  # If you need to run mysqld under a different user or group,

     7  # customize your systemd unit file for mariadb according to the

     8  # instructions in http://fedoraproject.org/wiki/Systemd

     9

    10  [mysqld_safe]

    11  log-error=/var/log/mariadb/mariadb.log

    12  pid-file=/var/run/mariadb/mariadb.pid

    13

    14  #

    15  # include all files from the config directory

    16  #

    17  !includedir /etc/my.cnf.d

    18

制造不同,并另存为新文件myyy.cnf

[root@localhost tmp]# diff my.cnf myyy.cnf

4d3

< # Disabling symbolic-links is recommended to prevent assorted security risks

6c5

< # Settings user and group are ignored when systemd is used.

---

> this line was replaced!

仔细理解下diff的输出:它并不执着于两个文件内容对应的行号是否完全一致。<号后对应的是命令中左侧文件的不一致部分,可以理解为箭头指向左侧,相应>号后是命令中右侧文件的不一致部分。d表示删掉,4d3表示定位到左侧文件第四行内容在右侧文件中被删除,右侧文件定位到第三行后。6c5则表示左侧文件的第六行被右侧文件第五行替换,之后分别列出了相应内容。也可以理解为,左侧文件经过在第几行处的d 、 c操作即可得出右侧新文件



下面再制造一个不同之处多些的文件

[root@localhost tmp]# cat my.cnf  | sed -e ‘4d‘ -e ‘6c this line was replaced!‘ -e ‘9i this is insert part‘ > new.cnf

[root@localhost tmp]# sed -i ‘12d‘ new.cnf

[root@localhost tmp]# cat new.cnf | grep symbolic

symbolic-links=0

[root@localhost tmp]# cat new.cnf | grep symbolic > 111

[root@localhost tmp]# cat 111

symbolic-links=0

[root@localhost tmp]# sed -i ‘4d‘ new.cnf ; cat 111 >>new.cnf

[root@localhost tmp]# cat -n my.cnf

     1  [mysqld]

     2  datadir=/var/lib/mysql

     3  socket=/var/lib/mysql/mysql.sock

     4  # Disabling symbolic-links is recommended to prevent assorted security risks

     5  symbolic-links=0

     6  # Settings user and group are ignored when systemd is used.

     7  # If you need to run mysqld under a different user or group,

     8  # customize your systemd unit file for mariadb according to the

     9  # instructions in http://fedoraproject.org/wiki/Systemd

    10

    11  [mysqld_safe]

    12  log-error=/var/log/mariadb/mariadb.log

    13  pid-file=/var/run/mariadb/mariadb.pid

    14

    15  #

    16  # include all files from the config directory

    17  #

    18  !includedir /etc/my.cnf.d

    19

[root@localhost tmp]# cat -n new.cnf

     1  [mysqld]

     2  datadir=/var/lib/mysql

     3  socket=/var/lib/mysql/mysql.sock

     4  this line was replaced!

     5  # If you need to run mysqld under a different user or group,

     6  # customize your systemd unit file for mariadb according to the

     7  this is insert part

     8  # instructions in http://fedoraproject.org/wiki/Systemd

     9

    10  [mysqld_safe]

    11  pid-file=/var/run/mariadb/mariadb.pid

    12

    13  #

    14  # include all files from the config directory

    15  #

    16  !includedir /etc/my.cnf.d

    17

    18  symbolic-links=0

[root@localhost tmp]# diff my.cnf  new.cnf

4,6c4

< # Disabling symbolic-links is recommended to prevent assorted security risks

< symbolic-links=0

< # Settings user and group are ignored when systemd is used.

---

> this line was replaced!

8a7

> this is insert part

12d10

< log-error=/var/log/mariadb/mariadb.log

19a18

> symbolic-links=0

这样似乎理解得更全面些。结合内容理解一下diff的运行结果。注意4,6是指左侧文件的第四五六行(四到六),而不是第四和六。


[root@localhost tmp]# diff -u my.cnf new.cnf > 222

[root@localhost tmp]# cat 222

--- my.cnf      2017-07-31 05:23:33.351268214 +0200

+++ new.cnf     2017-07-31 07:19:28.378359268 +0200

@@ -1,15 +1,13 @@

 [mysqld]

 datadir=/var/lib/mysql

 socket=/var/lib/mysql/mysql.sock

-# Disabling symbolic-links is recommended to prevent assorted security risks

-symbolic-links=0

-# Settings user and group are ignored when systemd is used.

+this line was replaced!

 # If you need to run mysqld under a different user or group,

 # customize your systemd unit file for mariadb according to the

+this is insert part

 # instructions in http://fedoraproject.org/wiki/Systemd


 [mysqld_safe]

-log-error=/var/log/mariadb/mariadb.log

 pid-file=/var/run/mariadb/mariadb.pid


 #

@@ -17,3 +15,4 @@

 #

 !includedir /etc/my.cnf.d


+symbolic-links=0

显示出公共行,方便比对。其中-后内容为左侧文件数据,+后为右侧文件数据







patch

根据diff -u file1 file2 命令运行结果更新file1内容与file2一致



[root@localhost tmp]# patch  -p0 < 222

patching file my.cnf

[root@localhost tmp]# diff my.cnf new.cnf

[root@localhost tmp]# patch  -R -p0 < 222

patching file my.cnf

[root@localhost tmp]# diff my.cnf new.cnf

4,6c4

< # Disabling symbolic-links is recommended to prevent assorted security risks

< symbolic-links=0

< # Settings user and group are ignored when systemd is used.

---

> this line was replaced!

8a7

> this is insert part

12d10

< log-error=/var/log/mariadb/mariadb.log

19a18

> symbolic-links=0

-p0取消目录层级。-R是反向的意思,还原更新。所以新旧文件顺序,在用diff生成patch文件时就很重要,一定习惯 旧文件 新文件 这样的比对顺序。





待续。。。





diff与patch的简单用法