Linux命令使用:diff、patch与dirname

Linux 是一种开放源代码的类 UNIX 操作系统,以其安全性和稳定性的优势,加上开源的特性和软件生态,被常用作服务器的操作系统。

下面列举一些常用的命令使用方式:

1. dirname <path>

功能:更改目录结构

示例:

tmpuser:~/ $ dirname /a/b/c                                      
/a/b
tmpuser:~/ $ dirname /a/b/c/                                
/a/b

该命令用于返回指定文件的当前目录,这里的指定文件也可以是一个目录。该命令常用于在脚本中切换目录到指定目录下,例如切换到执行的脚本当前目录,示例:

tmpuser:~/ $ cat test/a/b/c.sh                           
cd $(dirname $0)
echo $(pwd)
tmpuser:~/ $ sh test/a/b/c.sh                                    
/home/tmpuser/test/a/b

c.sh 文件内容中的 $0意思是取第一个参数,即调用的脚本自身。关于使用 $ 符号取参数相关操作,$* 获得给定脚本的输入参数,不包括脚本自身,$# 获得给定脚本的输入参数个数,不包括脚本自身。

$ 符号使用示例:

tmpuser:b/ $ cat c1.sh                                         
echo $*
echo $#
tmpuser:b/ $ sh c1.sh n1 n2                                       
n1 n2
2
2. diff <mode> <file1> <file2>

功能:比较文件修改,生成补丁(patch)文件

示例:

tmpuser:b/ $ cat f1                                               
a
b
c
tmpuser:b/ $ cat f2                                               
d
b
c
tmpuser:b/ $ diff f1 f2                                            
1c1
< a
---
> d

diff 命令用于比较文件的异同,文件的修改无非三种类型:

  • a:addition,增加内容
  • c:change,更改内容
  • d:deletion,删除内容

上述示例中的比较结果有四行,分析其表示含义:

  1. 1c1 三个字段分别表示 f1 文件第一行发生修改,修改类型为 changef2 文件第一行发生修改
  2. < a 表示f1文件第一行的修改内容为 a
  3. --- 作用为分隔符,分割两个文件的修改内容显示
  4. > d 表示f2文件第一行的修改内容为 d

由分析可知,这种直接的比较结果较为不直观,后续增加了两种比较模式,能够更清晰的展示文件的差异点。

【1】diff -c <file1> <file2>

context上下文模式展示差异

tmpuser:b/ $ diff -c f1 f2                                         
*** f1  2018-11-19 17:13:40.751373696 +0800
--- f2  2018-11-19 17:13:47.787557172 +0800
***************
*** 1,3 ****
- a
  b
  c
--- 1,3 ----
  b
  c
+ d

***---分别表示f1f2文件,修改内容展示以***************分割,*** 1,3 ****--- 1,3 ----分别表示展示的f1f2文件行数的内容,修改的三种类型:增加、更改、删除,在上下文模式中的表示方式为符号表示:

  • +:addition,增加内容
  • !:change,更改内容
  • -:deletion,删除内容

【2】diff -u <file1> <file2>

unified统一模式展示差异

tmpuser:b/ $ diff -u f1 f2                                        
--- f1  2018-11-19 17:13:40.751373696 +0800
+++ f2  2018-11-19 17:13:47.787557172 +0800
@@ -1,3 +1,3 @@
-a
 b
 c
+d

---+++分别表示f1f2文件,@@括起来的内容中,-1,3表示f1文件第一行有删除操作,显示文件一到三行的内容,+1,3表示f2文件第一行有增加操作,显示文件一到三行的内容,两个文件的修改都统一显示在一起。

diff命令的修改结果可以展示在命令窗口中,帮助查看文件的差异,也可以作为补丁(patch)文件存储起来,方便后续查看,也可以将生成的补丁文件应用到具体文件中,该行为多发生于版本控制系统中。

diff -Naru <file1> <file2> > <patch_file>

该命令将比较的修改结果保存到指定文件中。-r表示递归处理目录下文件,-u表示使用统一模式比较,-a表示逐行比较文件内容,-N表示进行目录比较时,若目录下有文件不存在,则与空白文件进行比较,而非显示一句文件是否存在的描述。

示例:

tmpuser:b/ $ diff -Naru f1 f2 > patch_file                        
tmpuser:b/ $ cat patch_file                                       
--- f1  2018-11-19 17:13:40.751373696 +0800
+++ f2  2018-11-19 17:13:47.787557172 +0800
@@ -1,3 +1,3 @@
-a
 b
 c
+d

patch文件内容可知,文件内容与直接输出在命令窗口内容相同。

3. patch <param> < <patch_file>

功能:应用补丁文件

示例:

tmpuser:b/ $ patch < patch_file                                
patching file f1
tmpuser:b/ $ cat f1                                              
b
c
d

该命令将diff命令产生的补丁文件应用到具体文件上,观察结果可知,f1文件进行了更新。

改命令提供了-R参数,应用取消补丁的应用。

取消应用补丁示例:

tmpuser:b/ $ patch -R < patch_file                                
patching file f1
tmpuser:b/ $ cat f1                                               
a
b
c

观察结果可知,f1文件恢复为原始内容。

以上所列出的示例,都是相同目录下直接进行文件比较和补丁应用,当遇到包含目录的情况时,需要注意目录等级的调整。

示例:

tmpuser:test/ $ diff -Naru d1 d2 > patch_file                      
tmpuser:test/ $ cat patch_file                                    
diff -Naru d1/a/b/c/f d2/a/b/c/f
--- d1/a/b/c/f  2018-11-19 18:56:30.440988972 +0800
+++ d2/a/b/c/f  2018-11-19 18:57:10.034070898 +0800
@@ -1,3 +1,3 @@
-a
 b
 c
+d

patch_file内容可知,此时比较的是当前目录下,d1/a/b/c/fd2/a/b/c/f两个子文件内容。若在当前目录下使用patch_file文件,则不需要进行目录等级调整,使用如下命令应用补丁文件:

tmpuser:test/ $ patch -p0 < patch_file                          
patching file d1/a/b/c/f
tmpuser:test/ $ cat d1/a/b/c/f                                   
b
c
d

命令中的-p<num>表示忽略几级目录,因为此时正处于和d1,d2同级目录下,所以不需要调整目录等级,参数指定-p0即可。

不妨进入到d1目录下,再次使用补丁文件,例如使用补丁文件对d1/a/b/c/f文件进行取消补丁应用操作:

tmpuser:test/ $ cd d1                                             
tmpuser:d1/ $ patch -Rp1 < ../patch_file                          
patching file a/b/c/f
tmpuser:d1/ $ cat a/b/c/f                                        
a
b
c

d1/a/b/c/f文件内容可知,该文件已经取消了对补丁文件的应用。

因为对补丁的应用中,可能存在目录等级调整的情况,所以在使用diff命令生成补丁文件时,尽量不使用绝对目录指定进行比较的文件。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏电光石火

微信登陆代码

网页访问 https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx&redirect_u...

4187
来自专栏前端小叙

nodejs的package.json依赖dependencies中 ^ 和 ~ 的区别

nodejs的package.json定义了一个模块,包括其依赖关系的一个简单的JSON文件,该文件可以包含多个不同的指令来告诉Node包管理器如何处理模块。 ...

3029
来自专栏程序员互动联盟

【编程基础】聊聊如何学习Java—Java开发环境配置

之前两篇文章介绍了为什么学习Java和Java语言的特性,很多网友询问如何配置Java开发环境,这一篇我就给大家聊聊如何配置Java环境。 1、下载J...

3799
来自专栏电光石火

微信登陆代码

网页访问 https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx&redirect_uri=...

2439
来自专栏IMWeb前端团队

Node基础:域名解析DNS(ok)

写在前面 Nodejs学习手册,基础总结之DNS模块。对从事web开发的同学来说,DNS解析再熟悉不过,在nodejs中也有一个模块可以完成dns解析的工作,使...

2826
来自专栏恒思考

实现app配置服务

我们要做一个app首先要实现后端,打算做个app叫恒思考。这个app后台由leancode,firebase,自建parse服务器。防止某个服务器不可用以后导致...

2833
来自专栏性能与架构

页面优化 - 使用cookie-free提高效率

在Yslow等页面优化建议中常会看到一个指标“Use cookie-free domains” 原因 当浏览器请求一个静态图片时,也会一并发送此域名的Cooki...

3747
来自专栏Jed的技术阶梯

通过已有的虚拟机克隆四台虚拟机

环境准备:一个已经安装好的虚拟机 要求: 删除了 /etc/udev/rules.d/70-persistent-net.rules 这个文件后,关机,保存...

2332
来自专栏机器学习实践二三事

Linux下的find命令详解

这篇讲讲Linux下文件查找的命令:locate和find,其中locate很简单,主要讲解find命令 locate 用法 locate to/find/...

23510
来自专栏行者悟空

Apache Zookeeper集群搭建(简化版)

1632

扫码关注云+社区

领取腾讯云代金券