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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容

  • list:1.输入、输出重定向;2.tr 转换或删除字符;3. | 管道;4.tee 重定向到多个目标; 5.rz...
    溪云初起日沉阁l阅读 508评论 0 2
  • Tcp/IP通信也是不安全的,在传输的时候也可能出现漏洞 查看正在运行的进程 adb shell ps -A |g...
    远远飘着云阅读 4,396评论 0 0
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,157评论 2 33
  • 第一行,本来想说“2016年了”,可是现在一月份都快结束,这么说实在不妥,但又想不到另一个点子,于是啰哩啰嗦的胡打...
    baijunxxx阅读 157评论 0 0