Zbrel 发表于 2017-9-1 16:57:01

每日命令--文件和目录管理diff, 补充patch

2.diff:是linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方,以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。
diff[参数][文件1或目录1][文件2或目录2]
-<行数>:指定要显示多少行的文本。此参数必须与-c或-u参数一并使用;
-a或——text:diff预设只会逐行比较文本文件;
-b或--ignore-space-change:不检查空格字符的不同;
-B或--ignore-blank-lines:不检查空白行;
-c:显示全部内容,并标出不同之处;
-C<行数>或--context<行数>:与执行“-c-<行数>”指令相同;
-d或——minimal:使用不同的演算法,以小的单位来做比较;
-D<巨集名称>或ifdef<巨集名称>:此参数的输出格式可用于前置处理器巨集;
-e或——ed:此参数的输出格式可用于ed的script文件;
-f或-forward-ed:输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处;
-H或--speed-large-files:比较大文件时,可加快速度;
-l<字符或字符串>或--ignore-matching-lines<字符或字符串>:若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异;
-i或--ignore-case:不检查大小写的不同;
-l或——paginate:将结果交由pr程序来分页;
-n或——rcs:将比较结果以RCS的格式来显示;
-N或--new-file:在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录,文件A 若使用-N参数,则diff会将文件A 与一个空白的文件比较;
-p:若比较的文件为C语言的程序码文件时,显示差异所在的函数名称;
-P或--unidirectional-new-file:与-N类似,但只有当第二个目录包含了第一个目录所没有的文件时,才会将这个文件与空白的文件做比较;
-q或--brief:仅显示有无差异,不显示详细的信息;
-r或——recursive:比较子目录中的文件;
-s或--report-identical-files:若没有发现任何差异,仍然显示信息;
-S<文件>或--starting-file<文件>:在比较目录时,从指定的文件开始比较;
-t或--expand-tabs:在输出时,将tab字符展开;
-T或--initial-tab:在每行前面加上tab字符以便对齐;
-u,-U<列数>或--unified=<列数>:以合并的方式来显示文件内容的不同;
-v或——version:显示版本信息;
-w或--ignore-all-space:忽略全部的空格字符;
-W<宽度>或--width<宽度>:在使用-y参数时,指定栏宽;
-x<文件名或目录>或--exclude<文件名或目录>:不比较选项中所指定的文件或目录;
-X<文件>或--exclude-from<文件>;您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件;
-y或--side-by-side:以并列的方式显示文件的异同之处;
--help:显示帮助;
--left-column:在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容;
--suppress-common-lines:在使用-y参数时,仅显示不同之处。
例如:
① 比较两个文件:diff log2014.log log2013.log
diff 的normal 显示格式有三种提示:
a - add
c - change
d - delete
② 并排格式输出: diff -y -W 50 log2014.log log2013.log
“|”表示前后2个文件内容有不同
“<”表示后面文件比前面文件少了1行内容
“>”表示后面文件比前面文件多了1行内容
③ 上下文输出格式:diff -c log2013.log log2014.log
这种方式在开头两行作了比较文件的说明,这里有三中特殊字符:
“+” 比较的文件的后者比前着多一行
“-” 比较的文件的后者比前着少一行
“!” 比较的文件两者有差别的行
④ 统一格式输出: diff -u log2014.log log2013.log
它的第一部分,也是文件的基本信息:"---"表示变动前的文件,"+++"表示变动后的文件。
第二部分,变动的位置用两个@作为起首和结束。如@@ -1,12 +1,10 @@,前面的"-1,12"分成三个部分:减号表示第一个文件(即log2014.log),"1"表示第1行,"12"表示连续12行。合在一起,就表示下面是第一个文件从第1行开始的连续12行。同样的,"+1,10"表示变动后,成为第二个文件从第1行开始的连续10行。
⑤ 比较文件夹不同:difftest3 test6
⑥ 比较两个文件不同,并生产补丁:diff -ruN log2013.log log2014.log >patch.log
⑦ 打补丁:
cat log2013.log #查看log2013.log的内容
diff -ruN log2013.log log2014.log >patch.log #比较两个文件
cat patch.log #查看补丁包的内容
patch log2013.log patch.log #使用补丁包升级log2013.log文件
cat log2013.log #再次查看log2013.log的内容

补充patch命令:让用户利用设置修补文件的方式,修改,更新原始文件。倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行。如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一。
patch(选项)(参数)
选项:
-b或--backup:备份每一个原始文件。
-B<备份字首字符串>或--prefix=<备份字首字符串>:设置文件备份时,附加在文件名称前面的字首字符串,该字符串可以是路径名称。
-c或--context:把修补数据解译成关联性的差异。
-d<工作目录>或--directory=<工作目录>:设置工作目录。
-D<标示符号>或--ifdef=<标示符号>:用指定的符号把改变的地方标示出来。
-e或--ed:把修补数据解译成ed指令可用的叙述文件。
-E或--remove-empty-files:若修补过后输出的文件其内容是一片空白,则移除该文件。
-f或--force:此参数的效果和指定"-t"参数类似,但会假设修补数据的版本为新版本。
-F<监别列数>或--fuzz<监别列数>:设置监别列数的最大值。
-g<控制数值>或--get=<控制数值>:设置以RSC或SCCS控制修补作业。
-i<修补文件>或--input=<修补文件>:读取指定的修补文件。
-l或--ignore-whitespace:忽略修补数据与输入数据的跳格,空格字符。
-n或--normal:把修补数据解译成一般性的差异。
-N或--forward:忽略修补的数据较原始文件的版本更旧,或该版本的修补数据已使用过。
-o<输出文件>或--output=<输出文件>:设置输出文件的名称,修补过的文件会以该名称存放。
-p<剥离层级>或--strip=<剥离层级>:设置欲剥离几层路径名称。
-f<拒绝文件>或--reject-file=<拒绝文件>:设置保存拒绝修补相关信息的文件名称,预设的文件名称为.rej。
-R或--reverse:假设修补数据是由新旧文件交换位置而产生。
-s或--quiet或--silent:不显示指令执行过程,除非发生错误。
-t或--batch:自动略过错误,不询问任何问题。
-T或--set-time:此参数的效果和指定"-Z"参数类似,但以本地时间为主。
-u或--unified:把修补数据解译成一致化的差异。
-v或--version:显示版本信息。
-V<备份方式>或--version-control=<备份方式>:用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用"-z"参数变更,当使用"-V"参数指定不同备份方式时,也会产生不同字尾的备份字符串。
-Y<备份字首字符串>或--basename-prefix=--<备份字首字符串>:设置文件备份时,附加在文件基本名称开头的字首字符串。
-z<备份字尾字符串>或--suffix=<备份字尾字符串>:此参数的效果和指定"-B"参数类似,差别在于修补作业使用的路径与文件名若为src/linux/fs/super.c,加上"backup/"字符串后,文件super.c会备份于/src/linux/fs/backup目录里。
-Z或--set-utc:把修补过的文件更改,存取时间设为UTC。
--backup-if-mismatch:在修补数据不完全吻合,且没有刻意指定要备份文件时,才备份文件。
--binary:以二进制模式读写数据,而不通过标准输出设备。
--help:在线帮助。
--nobackup-if-mismatch:在修补数据不完全吻合,且没有刻意指定要备份文件时,不要备份文件。
--verbose:详细显示指令的执行过程。
参数:
原文件:指定需要打补丁的原始文件;
补丁文件:指定补丁文件。
例如:
① 使用patch指令将文件"testfile1"升级,其升级补丁文件为"testfile.patch":patch -p0 testfile1 testfile.patch
patch -p0       (“p”指的是路径,后面的数字表示去掉路径的第几部分。"0",表示不去掉,为全路径)
patch -p1       (“p”后面的数字"1",表示去掉前第一个路径)
页: [1]
查看完整版本: 每日命令--文件和目录管理diff, 补充patch