Linux
是一种开放源代码的类 UNIX
操作系统,以其安全性和稳定性的优势,加上开源的特性和软件生态,被常用作服务器的操作系统。
下面列举一些常用的命令使用方式:
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
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
命令用于比较文件的异同,文件的修改无非三种类型:
上述示例中的比较结果有四行,分析其表示含义:
1c1
三个字段分别表示 f1
文件第一行发生修改,修改类型为 change
,f2
文件第一行发生修改< a
表示f1
文件第一行的修改内容为 a
---
作用为分隔符,分割两个文件的修改内容显示> 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
***
和---
分别表示f1
和f2
文件,修改内容展示以***************
分割,*** 1,3 ****
和--- 1,3 ----
分别表示展示的f1
和f2
文件行数的内容,修改的三种类型:增加、更改、删除,在上下文模式中的表示方式为符号表示:
【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
---
和+++
分别表示f1
和f2
文件,@@
括起来的内容中,-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
文件内容可知,文件内容与直接输出在命令窗口内容相同。
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/f
和d2/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
命令生成补丁文件时,尽量不使用绝对目录指定进行比较的文件。