diff命令来自于英文单词different的缩写,其功能是用于比较文件内容差异。如果有多个内容相近的文件,如何快速定位到不同内容所在位置?此时用diff命令就再合适不过了!
**语法格式:**diff [参数] 文件1 文件2
常用参数:
| -a | 逐行比较文本文件 |
|---|---|
| -b | 不检查空格字符的不同 |
| -W | 指定栏宽 |
| -x | 不比较选项中所指定的文件或目录 |
| -X | 将文件或目录类型存成文本文件 |
| -y | 以并列的方式显示文件的异同之处 |
| –brief | 仅判断两个文件是否不同 |
| –help | 查看帮助信息 |
| –left-column | 若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容 |
| –suppress-common-lines | 在使用-y参数时,仅显示不同之处 |
参考实例
linux@ubuntu:~/work$ ls
99.c
linux@ubuntu:~/work$ cp 99.c 100.c
linux@ubuntu:~/work$ ls
100.c 99.c
linux@ubuntu:~/work$ diff 99.c 100.c #判断2个文件是否相同, 相同没有输出, 不同会告诉不同之处
linux@ubuntu:~/work$ vi 100.c
linux@ubuntu:~/work$ diff 99.c 100.c # 后面的文件比前面的文件 多(>) 还是少(<)
11a12
> printf("\n"); # 100.c 比 99.c 多的内容
12a14
> return 0;
linux@ubuntu:~/work$ diff 100.c 99.c
12d11
< printf("\n"); # 99.c 比 100.c 少的内容
14d12
< return 0;
linux@ubuntu:~/work$ diff -c 99.c 100.c # 100.c 比 99.c 多(+) 少(-)
*** 99.c 2022-08-02 11:02:02.482386000 +0800
--- 100.c 2022-08-25 08:53:35.968734345 +0800
***************
*** 9,14 ****
--- 9,16 ----
printf("%d x %d = %-2d ",j,i,i*j);
}
printf("\n");
+ printf("\n");
}
return 0;
+ return 0;
}
linux@ubuntu:~/work$
linux@ubuntu:~/work$ diff -c 100.c 99.c # 99.c 比 100.c 少(-)
*** 100.c 2022-08-25 08:53:35.968734345 +0800
--- 99.c 2022-08-02 11:02:02.482386000 +0800
***************
*** 9,16 ****
printf("%d x %d = %-2d ",j,i,i*j);
}
printf("\n");
- printf("\n");
}
return 0;
- return 0;
}
--- 9,14 ----
linux@ubuntu:~/work$
diff 除了可以比较文件外, 也可以用于生成补丁文件
diff -uNr 1.1.c 1.2.c >1.1_1.2.patch # 生成补丁, 1.2.c是升级的版本, 1.1.c要升级的版本
例如
linux@ubuntu:~/work$ ls
100.c 99.c
linux@ubuntu:~/work$ vi 100.c
linux@ubuntu:~/work$ mv 99.c 1.1.c
linux@ubuntu:~/work$ mv 100.c 1.2.c
linux@ubuntu:~/work$ diff -uNr 1.1.c 1.2.c >1.1_1.2.patch
linux@ubuntu:~/work$ cat 1.1_1.2.patch
--- 1.1.c 2022-08-02 11:02:02.482386000 +0800
+++ 1.2.c 2022-08-25 09:05:51.270640423 +0800
@@ -7,8 +7,11 @@
for(int j=1;j<i+1;j++) // 控制列数
{
printf("%d x %d = %-2d ",j,i,i*j);
+ printf("%d x %d = %-2d ",j,i,i*j);
}
printf("\n");
+ printf("\n");
}
return 0;
+ return 0;
}
linux@ubuntu:~/work$
patch命令让用户利用设置修补文件的方式,修改,更新原始文件。倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行。如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一 。
**语法格式:**patch [参数]
patch -p0 <1.1_1.2.patch # 1.1_1.2.patch 补丁包会自动找当前目录下的文件进行打补丁
# -p0 : 是在同级目录进行 , 主要是确认补丁的源文件在哪一个目录下
# -p1 : 是在子1级目录进行, 以此类推
参考实例
linux@ubuntu:~/work$ ls
1.1_1.2.patch 1.1.c 1.2.c
linux@ubuntu:~/work$ diff -c 1.1.c 1.2.c
*** 1.1.c 2022-08-25 09:14:04.399767049 +0800
--- 1.2.c 2022-08-25 09:05:51.270640423 +0800
***************
*** 7,14 ****
--- 7,17 ----
for(int j=1;j<i+1;j++) // 控制列数
{
printf("%d x %d = %-2d ",j,i,i*j);
+ printf("%d x %d = %-2d ",j,i,i*j);
}
printf("\n");
+ printf("\n");
}
return 0;
+ return 0;
}
linux@ubuntu:~/work$ patch -p0 <1.1_1.2.patch
patching file 1.1.c
linux@ubuntu:~/work$ diff -c 1.1.c 1.2.c
linux@ubuntu:~/work$