diff比较两个文件 linux
功能:比较两个文件的差异,并把不同地方的信息显示出来。默认diff格式的信息。
diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的补丁文件。也使用patch命令对相应的文件打补丁。differential [ˌdɪfəˈrenʃəl]
语法:diff [options] FILES
FILES的格式:
- FILE1 FILE2 :源是一个文件,目标也是文件。这两个文件必须是文本文件。以逐行的方式,比较文本文件的异同处。
- DIR1 DIR2 :源是一个目录,目标是目录。diff 命令会比较两个目录下名字相同的文本文件,依照字母次序排序,列出不同的二进制文件,列出公共子目录,列出只在一个目录出现的文件。
- FILE DIR :源是一个文件,目标是目录。diff命令把源文件与目标目录下的同名文件比较。
- DIR FILE :源是一个目录,目标是文件(不是目录)。源目录下所有文件中与目标文件同名的文件,将用来与目标文件比较。
FILE可以是“-”,代表由标准输入设备读入的文本。DIR不能是"-"。
被指定的文件不能是标准的输入。
| 短选项 | 长选项 | 含义 |
|---|---|---|
| -i | --ignore-case | 忽略文件内容大小写的区别 |
| --ignore-file-name-case | 忽略文件名大小写的区别 | |
| --no-ignore-file-name-case | 不忽略文件名大小写的区别 | |
| -E | --ignore-tab-expansion | 忽略由制表符宽度造成的差异 |
| -b | --ignore-space-change | 忽略由空格数不同造成的差异 |
| -w | --ignore-all-space | 忽略所有空格 |
| -B | --ignore-blank-lines | 忽略任何因空行而造成的差异 |
| -I | --ignore-matching-lines=RE | 如果某行匹配正则表达式,则忽略由该行造成的差异 |
| -a | --text | 所有文件都以文本方式处理 |
| --strip-trailing-cr | 去除输入内容每行末端的 carriage return 字符 | |
| -c 或 或 -C 行数 | --context[=行数] | 显示指定<行数>(默认 3 行)copied 格式的上下文 |
| -u 或 -U 行数 | --unified[=行数] | 显示指定<行数>(默认 3 行)unified 格式的上下文(合并的方式) |
| --label 标识 | 使用<标识>代替文件名称 | |
| -p | --show-c-function | 显示和每个差异有关的 C 函数名称 |
| -F | --show-function-line=RE | 显示最接近而符合<正则表示式>的一行 |
| -q | --brief | 只显示文件是否不同 |
| -e | --ed | 以 ed script 方式输出 |
| --normal | 以正常的 diff 方式输出 | |
| -n | --rcs | 以 RCS diff 格式输出 |
| -y | --side-by-side | 以两列并排的方式显示 |
| -W | --width=NUM | 每行显示最多 NUM (默认 130) 个字符 |
| --left-column | 当有两行相同时只显示左边的一行 | |
| --suppress-common-lines | 当有两行相同时不会显示 | |
| -D | --ifdef=NAME | 输出的内容以‘#ifdef NAME’方式标明差异 |
| --GTYPE-group-format=GFMT | 效果类似,但会以 GFMT 格式处理 GTYPE 输入的行 可以是LTYPE的选择或是‘changed’ |
|
| --line-format=LFMT | 效果类似,但会以 LFMT 格式处理每一行资料 | |
| --LTYPE-line-format=LFMT | 效果类似,但会以 LFMT 格式处理 LTYPE 输入的行 LTYPE 可以是‘old’、‘new’或‘unchanged’。 |
|
| -l | --paginate | 将输出送至‘pr’指令来分页 |
| -t | --expand-tabs | 将输出中的 tab 转换成空格 |
| -T | --initial-tab | 每行先加上 tab 字符,使 tab 字符可以对齐 |
| --tabsize=NUM | 定位字符 (tab) 的宽度,默认为 8 个空格宽 | |
| --suppress-blank-empty | suppress space or tab before empty output lines | |
| -r | --recursive | 递归比较子目录中的文件 |
| -N | --new-file | 不存在的文件以空文件方式处理 |
| --unidirectional-new-file | 若第一文件案不存在,以空文件处理 | |
| -s | --report-identical-files | 文件相同则报告,否则无任何提示 |
| -x | --exclude=PAT | 排除匹配 PAT 的文件 |
| -X | --exclude-from=FILE | 排除所有匹配在 FILE 中列出的模式的文件 |
| -S | --starting-file=FILE | 当比较目录時,由 FILE 开始比较 |
| --from-file=FILE1 | 将 FILE1 和操作数中的所有文件/目录作比较。FILE1 可以是目录 | |
| --to-file=FILE2 | 将操作数中的所有文件/目录和 FILE2 作比较。FILE2 可以是目录 | |
| --horizon-lines=NUM | keep NUM lines of the common prefix and suffix | |
| -d | --minimal | 尽可能找出最小的差异 |
| --speed-large-files | 假设文件十分大而且其中含有许多微小的差异 |
diff输出格式(默认):
n1 a n3,n4 表示在文件1的n1行后面添加n3到n4行
n1,n2 d n3 表示在n1到n2行之间删除n3行
n1,n2 c n3,n4 表示把n1,n2行用n3,n4行替换掉
字母a:表示附加(add)
字符c:表示修改(change)
字符d:表示删除(delete)
字母前的是源文件,字母后是目标文件。Nx表示行号。
以”<”打头的行属于第一个文件,以”>”打头的行属于第二个文件。
比较文件
log2014.log内容
2013-01
2013-02
2014-03
2013-04
2013-05
2013-06
2013-07
2013-07
2013-09
2013-10
2013-11
2013-12
log2013.log内容
2013-01
2013-02
2013-03
2013-04
2013-05
2013-06
2013-07
2013-08
2013-09
2013-10
比较两个文件
[root@localhost test3]#diff log2014.log log2013.log
3c3
< 2014-03
---
> 2013-03
8c8
< 2013-07
---
> 2013-08
11,12d10
< 2013-11
< 2013-12
上面的“3c3”和“8c8”表示log2014.log和log20143log文件在3行和第8行内容有所不同;"11,12d10"表示第一个文件比第二个文件多了第11和12行。并排格式输出
以”<”打头的行属于第一个文件,以”>”打头的行属于第二个文件。
[root@localhost test3]#diff log2014.log log2013.log -y -W 50
2013-01 2013-01
2013-02 2013-02
2014-03 | 2013-03
2013-04 2013-04
2013-05 2013-05
2013-06 2013-06
2013-07 2013-07
2013-07 | 2013-08
2013-09 2013-09
2013-10 2013-10
2013-11 <
2013-12 < [root@localhost test3]#diff log2013.log log2014.log -y -W 50
2013-01 2013-01
2013-02 2013-02
2013-03 | 2014-03
2013-04 2013-04
2013-05 2013-05
2013-06 2013-06
2013-07 2013-07
2013-08 | 2013-07
2013-09 2013-09
2013-10 2013-10
> 2013-11
> 2013-12
说明:上下文输出格式
“|”表示前后2个文件内容有不同
“<”表示后面文件比前面文件少了1行内容
“>”表示后面文件比前面文件多了1行内容
[root@localhost test3]#diff log2013.log log2014.log -c
*** log2013.log 2012-12-07 16:36:26.000000000 +0800
--- log2014.log 2012-12-07 18:01:54.000000000 +0800
***************
*** 1,10 ****
2013-01
2013-02
! 2013-03
2013-04
2013-05
2013-06
2013-07
! 2013-08
2013-09
2013-10
--- 1,12 ----
2013-01
2013-02
! 2014-03
2013-04
2013-05
2013-06
2013-07
! 2013-07
2013-09
2013-10
+ 2013-11
+ 2013-12 [root@localhost test3]#diff log2014.log log2013.log -c
*** log2014.log 2012-12-07 18:01:54.000000000 +0800
--- log2013.log 2012-12-07 16:36:26.000000000 +0800
***************
*** 1,12 ****
2013-01
2013-02
! 2014-03
2013-04
2013-05
2013-06
2013-07
! 2013-07
2013-09
2013-10
- 2013-11
- 2013-12
--- 1,10 ----
2013-01
2013-02
! 2013-03
2013-04
2013-05
2013-06
2013-07
! 2013-08
2013-09
2013-10
[root@localhost test3]#
这种方式在开头两行作了比较文件的说明,这里有三中特殊字符:统一格式输出
“+” 比较的文件的后者比前着多一行
“-” 比较的文件的后者比前着少一行
“!” 比较的文件两者有差别的行
[root@localhost test3]#diff log2014.log log2013.log -u
--- log2014.log 2012-12-07 18:01:54.000000000 +0800
+++ log2013.log 2012-12-07 16:36:26.000000000 +0800
@@ -1,12 +1,10 @@
2013-01
2013-02
-2014-03
+2013-03
2013-04
2013-05
2013-06
2013-07
-2013-07
+2013-08
2013-09
2013-10
-2013-11
-2013-12第一部分,也是文件的基本信息:
--- log2014.log 2012-12-07 18:01:54.000000000 +0800
+++ log2013.log 2012-12-07 16:36:26.000000000 +0800
"---"表示变动前的文件,"+++"表示变动后的文件。 第二部分,变动的位置用两个@作为起首和结束
@@ -1,12 +1,10 @@
前面的"-1,12"分成三个部分:减号表示第一个文件(即log2014.log),"1"表示第1行,"12"表示连续12行。意思:第一个文件从第1行开始的连续12行。
同样的,"+1,10" 表示第二个文件从第1行开始的连续10行。
比较文件夹
[root@localhost test]#diff test3 test6
Only in test6: linklog.log
Only in test6: log2012.log [root@localhost test]#diff test3/log2013.log test6/log2013.log
1,10c1,3
< 2013-01
< 2013-02
< 2013-03
< 2013-04
< 2013-05
< 2013-06
< 2013-07
< 2013-08
< 2013-09
< 2013-10
---
> hostnamebaidu=baidu.com
> hostnamesina=sina.com
> hostnames=true [root@localhost test]#diff test3/log2014.log test6/log2014.log
1,12d0
< 2013-01
< 2013-02
< 2014-03
< 2013-04
< 2013-05
< 2013-06
< 2013-07
< 2013-07
< 2013-09
< 2013-10
< 2013-11
< 2013-12
Only in test6: log2015.log
Only in test6: log2016.log
Only in test6: log2017.log
[root@localhost test]#
比较两个文件不同,并生产补丁
[root@localhost test3]#diff -ruN log2013.log log2014.log >patch.log
[root@localhost test3]# ll
总计 12
-rw-r--r-- 2 root root 80 12-07 16:36 log2013.log
-rw-r--r-- 1 root root 96 12-07 18:01 log2014.log
-rw-r--r-- 1 root root 248 12-07 21:33 patch.log [root@localhost test3]# cat patch.log
--- log2013.log 2012-12-07 16:36:26.000000000 +0800
+++ log2014.log 2012-12-07 18:01:54.000000000 +0800
@@ -1,10 +1,12 @@
2013-01
2013-02
-2013-03
+2014-03
2013-04
2013-05
2013-06
2013-07
-2013-08
+2013-07
2013-09
2013-10
+2013-11
+2013-12
[root@localhost test3]#
打补丁
[root@localhost test3]# cat log2013.log
2013-01
2013-02
2013-03
2013-04
2013-05
2013-06
2013-07
2013-08
2013-09
2013-10 [root@localhost test3]#patch log2013.log patch.log使用上面产生的patch.log文件打补丁
patching file log2013.log [root@localhost test3]# cat log2013.log
2013-01
2013-02
2014-03
2013-04
2013-05
2013-06
2013-07
2013-07
2013-09
2013-10
2013-11
2013-12
[root@localhost test3]#
实例
实例:有这样两个文件。程序清单1,程序清单2
程序清单1 :hello.c
#include
int main(void)
{
char msg[] = "Hello world!"; puts(msg);
printf("Welcome to use diff commond.n"); return 0;
}程序清单2:hello_diff.c
#include
#include
int main(void)
{
char msg[] = "Hello world,fome hello_diff.c"; puts(msg);
printf("hello_diff.c says,'Here you are,using diff.'n"); return 0;
}
我们使用diff命令来查看这两个文件的不同之处,有一下几种方便的方法:
1、普通格式输出:
[root@localhost diff]#diff hello.c hello_diff.c
1a2
> #include
5c6
char msg[] = "Hello world,fome hello_diff.c";
8c9
printf("hello_diff.c says,'Here you are,using diff.'n");
[root@localhost diff]#
上面的“1a2”表示后面的一个文件"hello_diff.c"比前面的一个文件"hello.c"多了一行2、并排格式输出
"5c6"表示第一个文件的第5行与第二个文件的第6行有区别
[root@localhost diff]#diff hello.c hello_diff.c -y -W 130-W选择可以指定输出列的宽度,这里指定输出列宽为130
#include #include
> #include
int main(void) int main(void)
{ {
char msg[] = "Hello world!"; | char msg[] = "Hello world,fome hello_diff.c";
puts(msg); puts(msg);
printf("Welcome to use diff commond.n"); | printf("hello_diff.c says,'Here you are,using diff.'
return 0; return 0;
} }
[root@localhost diff]#
这种并排格式的对比一目了然,可以快速找到不同的地方。3、上下文输出格式
[root@localhost diff]#diff hello.c hello_diff.c -c
*** hello.c 2007-09-25 17:54:51.000000000 +0800
--- hello_diff.c 2007-09-25 17:56:00.000000000 +0800
***************
*** 1,11 ****
#include int main(void)
{
! char msg[] = "Hello world!"; puts(msg);
! printf("Welcome to use diff commond.n"); return 0;
}
--- 1,12 ----
#include
+ #include int main(void)
{
! char msg[] = "Hello world,fome hello_diff.c"; puts(msg);
! printf("hello_diff.c says,'Here you are,using diff.'n"); return 0;
}
[root@localhost diff]#
这种方式在开头两行作了比较文件的说明,这里有三中特殊字符:4、统一输出格式
+ 比较的文件的后者比前着多一行
- 比较的文件的后者比前着少一行
! 比较的文件两者有差别的行
[root@localhost diff]#diff hello.c hello_diff.c -u
--- hello.c 2007-09-25 17:54:51.000000000 +0800
+++ hello_diff.c 2007-09-25 17:56:00.000000000 +0800
@@ -1,11 +1,12 @@
#include
+#include int main(void)
{
- char msg[] = "Hello world!";
+ char msg[] = "Hello world,fome hello_diff.c"; puts(msg);
- printf("Welcome to use diff commond.n");
+ printf("hello_diff.c says,'Here you are,using diff.'n"); return 0;
}
[root@localhost diff]# 5、其他
[root@localhost diff]#diff hello.c hello_diff.c -q假如你想查看两个文件是否不同又不想显示差异之处的话,可以加上-q选项
Files hello.c and hello_diff.c differ
[root@localhost diff]#
[root@localhost diff]#diff hello.c hello_diff.c -c -I include这里通过“ -I include”选项来忽略带有“ include”字样的行。另外你还可以提供一些匹配规则来忽略某中差别,可以用 -I regexp
*** hello.c 2007-09-25 17:54:51.000000000 +0800
--- hello_diff.c 2007-09-25 17:56:00.000000000 +0800
***************
*** 2,11 **** int main(void)
{
! char msg[] = "Hello world!"; puts(msg);
! printf("Welcome to use diff commond.n"); return 0;
}
--- 3,12 ---- int main(void)
{
! char msg[] = "Hello world,fome hello_diff.c"; puts(msg);
! printf("hello_diff.c says,'Here you are,using diff.'n"); return 0;
}
[root@localhost diff]#
diff比较两个文件 linux的更多相关文章
- diff 比较两个文件的差异
功能:比较两个文件的差异,并把不同地方的信息显示出来.默认diff格式的信息. diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的补丁文件.也使用patch命令对 ...
- diff比较两个文件的差异
1.diff -ruN a.txt b.txt>patch.txt比较第二个文件与第一个文件相比的变化,并将变化添加到patch.txt文件中,-表示删除的行,+表示添加的行 2.下面的,“&l ...
- diff 比较两个文件的不同
1.命令功能 diff 逐行比较文件内容,并输出文件差异. 2.语法格式 diff option file1 file2 diff 选项 文件1 文件2 参数说明 参数 参数说明 ...
- diff - 找出两个文件的不同点
总览 diff [选项] 源文件 目标文件 描述 在最简单的情况是, diff 比较两个文件的内容 (源文件 和 目标文件). 文件名可以是 - 由标准输入设备读入的文本. 作为特别的情况是, dif ...
- linux比较两个文件的不同(6/21)
cmp 命令:比较任意两个类型的文件,且吧结果输出到标准输出,默认文件相同不输出,不同的文件输出差异 必要参数 -c 显示不同的信息-l 列出所有的不同信息-s 错误信息不提示 选择参数 -i< ...
- linux diff-比较给定的两个文件的不同
推荐:更多Linux 文件查找和比较 命令关注:linux命令大全 diff命令在最简单的情况下,比较给定的两个文件的不同.如果使用“-”代替“文件”参数,则要比较的内容将来自标准输入.diff命令是 ...
- Linux下对比两个文件夹的方法
最近拿到一份源代码,要命的是这份源代码是浅克隆模式的git包,所以无法完整显示里面的修改的内容. 今天花了一点点时间,找了一个在Linux对比两个文件夹的方法. 其实方法很简单,用meld 去对比两个 ...
- linux两个文件修改主机名
linux修改主机名的方法 用hostname命令可以临时修改机器名,但机器重新启动之后就会恢复原来的值. #hostname //查看机器名#hostname -i //查看本机器名对应的ip ...
- linux比较两个文件是否一样(linux命令md5sum使用方法)
1.简介 MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一 ...
随机推荐
- RSA 非对称加密【转】
演示代码:https://pan.baidu.com/s/10rfSUUDEEHvCDEYH0oEVCw Base64工具类,可以让rsa编码的乱码变成一串字符序列 1 package com.uti ...
- Vue用v-for给循环标签自身属性添加属性值
转自http://www.cnblogs.com/lliuhh/p/7691604.html <RadioGroup v-model="animal"> <Rad ...
- 使用jquery获取父元素或父节点
使用jquery获取父元素或父节点,比较简单,jquery提供了丰富的方法来让我们使用jquery获取父元素或父节点 jquery获取父元素方法比较多,比如parent(),parents(),c ...
- MySQL常用引擎的锁机制
一.引言 ...
- 元素滚动到底部或顶部时阻止body滚动
移动端的弹窗内容有滚动条,滚动到底部或顶部时或影响弹窗下的body滚动,某些浏览器滚动到顶部时不松手就触发了刷新页面的情况,如果不需要这样的默认体验,就需要加一下判断了. var startX,sta ...
- SPOJ LCS2 - Longest Common Substring II 字符串 SAM
原文链接http://www.cnblogs.com/zhouzhendong/p/8982484.html 题目传送门 - SPOJ LCS2 题意 求若干$(若干<10)$个字符串的最长公共 ...
- LoadRunner录制协议的选择
1.选择协议(提高测试结果的准确性) New Single Protocol Script:单协议脚本,选择一种主协议进行测试 New Multiple Protocol Script:多协议脚本,选 ...
- Linux下java开发环境配置总结
1 安装JDK,卸载以前的jdk,安装jdk1.8 : 参考:http://www.jb51.net/os/RedHat/73016.html 需要注意配置环境变量中的路径要和当前安装的jdk路径一致 ...
- HDU 4825 Xor Sum (模板题)【01字典树】
<题目链接> 题目大意: 给定n个数,进行m次查找,每次查找输出n个数中与给定数异或结果最大的数. 解题分析: 01字典树模板题,01字典树在求解异或问题上十分高效.利用给定数据的二进制数 ...
- anaconda源配置
1. 生成配置文件 第一次运行 conda config命令时,将会在用户的home目录创建该文件..condarc配置文件,是一种可选的(optional)运行期配置文件,其默认情况下是不存在的. ...