前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux命令使用:diff、patch与dirname

Linux命令使用:diff、patch与dirname

作者头像
zhipingChen
发布2018-11-21 18:31:18
2.2K0
发布2018-11-21 18:31:18
举报
文章被收录于专栏:编程理解编程理解

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

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

1. dirname <path>

功能:更改目录结构

示例:

代码语言:javascript
复制
tmpuser:~/ $ dirname /a/b/c                                      
/a/b
tmpuser:~/ $ dirname /a/b/c/                                
/a/b

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

代码语言:javascript
复制
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意思是取第一个参数,即调用的脚本自身。关于使用 $ 符号取参数相关操作,$* 获得给定脚本的输入参数,不包括脚本自身,$# 获得给定脚本的输入参数个数,不包括脚本自身。

$ 符号使用示例:

代码语言:javascript
复制
tmpuser:b/ $ cat c1.sh                                         
echo $*
echo $#
tmpuser:b/ $ sh c1.sh n1 n2                                       
n1 n2
2
2. diff <mode> <file1> <file2>

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

示例:

代码语言:javascript
复制
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上下文模式展示差异

代码语言:javascript
复制
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统一模式展示差异

代码语言:javascript
复制
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表示进行目录比较时,若目录下有文件不存在,则与空白文件进行比较,而非显示一句文件是否存在的描述。

示例:

代码语言:javascript
复制
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>

功能:应用补丁文件

示例:

代码语言:javascript
复制
tmpuser:b/ $ patch < patch_file                                
patching file f1
tmpuser:b/ $ cat f1                                              
b
c
d

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

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

取消应用补丁示例:

代码语言:javascript
复制
tmpuser:b/ $ patch -R < patch_file                                
patching file f1
tmpuser:b/ $ cat f1                                               
a
b
c

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

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

示例:

代码语言:javascript
复制
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文件,则不需要进行目录等级调整,使用如下命令应用补丁文件:

代码语言:javascript
复制
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文件进行取消补丁应用操作:

代码语言:javascript
复制
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命令生成补丁文件时,尽量不使用绝对目录指定进行比较的文件。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.11.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. dirname <path>
  • 2. diff <mode> <file1> <file2>
  • 3. patch <param> < <patch_file>
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档