添加命令

This commit is contained in:
jaywcjlove 2016-11-30 17:09:41 +08:00
parent e5718867d5
commit aebe5ac455
42 changed files with 2234 additions and 0 deletions

22
command/arj.md Normal file
View File

@ -0,0 +1,22 @@
arj
===
用于创建和管理.arj压缩包
## 补充说明
**arj命令** 是“.arj”格式的压缩文件的管理器用于创建和管理“.arj”压缩包。
### 语法
```
arj(参数)
```
### 参数
* 操作指令:对“.arj”压缩包执行的操作指令
* 压缩包名称指定要操作的arj压缩包名称。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

47
command/basename.md Normal file
View File

@ -0,0 +1,47 @@
basename
===
打印目录或者文件的基本名称
## 补充说明
**basename命令** 用于打印目录或者文件的基本名称。basename和dirname命令通常用于shell脚本中的命令替换来指定和指定的输入文件名称有所差异的输出文件名称。
### 语法
```
basename(选项)(参数)
```
### 选项
```
--help显示帮助
--version显示版本号。
```
### 参数
* 文件:带路径信息的文件;
* 后缀:可选参数,指定要去除的文件后缀字符串。
### 实例
1、要显示一个shell变量的基本名称请输入
```
basename $WORKFILE
```
此命令显示指定给shell变量WORKFILE的值的基本名称。如果WORKFILE变量的值是`/home/jim/program.c`文件则此命令显示program.c。
要构造一个和另一个文件名称相同(除了后缀)的文件名称,请输入:
```
OFILE=`basename $1 .c`.o
```
此命令指定给 OFILE 文件第一个位置上的参数($1的值但它的 .c 后缀更改至 .o。如果 $1 是 /home/jim/program.c 文件,则 OFILE 成为 program.o。因为 program.o 仅是一个基本文件名称,它标识在当前目录中的文件。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

39
command/bzcat.md Normal file
View File

@ -0,0 +1,39 @@
bzcat
===
解压缩指定的.bz2文件
## 补充说明
**bzcat命令** 解压缩指定的.bz2文件并显示解压缩后的文件内容。保留原压缩文件并且不生成解压缩后的文件。
### 语法
```
bzcat(参数)
```
### 参数
.bz2压缩文件指定要显示内容的.bz2压缩文件。
### 实例
将`/tmp/man.config`以bzip2格式压缩
```
bzip2 -z man.config
```
此时man.config会变成man.config.bz2
将上面的压缩文件内容读出来:
```
bzcat man.config.bz2
```
此时屏幕上会显示 man.config.bz2 解压缩之后的文件内容。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

22
command/bzcmp.md Normal file
View File

@ -0,0 +1,22 @@
bzcmp
===
比较两个压缩包中的文件
## 补充说明
**bzcmp命令** 主要功能是在不真正解压缩.bz2压缩包的情况下比较两个压缩包中的文件省去了解压缩后在调用cmp命令的过程。
### 语法
```
bzcmp(参数)
```
### 参数
* 文件1指定要比较的第一个.bz2压缩包
* 文件2指定要比较的第二个.bz2压缩包。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

22
command/bzdiff.md Normal file
View File

@ -0,0 +1,22 @@
bzdiff
===
直接比较两个.bz2压缩包中文件的不同
## 补充说明
**bzdiff命令** 用于直接比较两个“.bz2”压缩包中文件的不同省去了解压缩后再调用diff命令的过程。
### 语法
```
bzdiff(参数)
```
### 参数
* 文件1指定要比较的第一个.bz2压缩包
* 文件2指定要比较的第二个.bz2压缩包。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

22
command/bzgrep.md Normal file
View File

@ -0,0 +1,22 @@
bzgrep
===
使用正则表达式搜索.bz2压缩包中文件
## 补充说明
**bzgrep命令** 使用正则表达式搜索“.bz2”压缩包中文件将匹配的行显示到标注输出。
### 语法
```
bzgrep(参数)
```
### 参数
* 搜索模式:指定要搜索的模式;
* .bz2文件指定要搜索的.bz2压缩包。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

21
command/bzless.md Normal file
View File

@ -0,0 +1,21 @@
bzless
===
增强.bz2压缩包查看器
## 补充说明
**bzless命令** 是增强“.bz2”压缩包查看器bzless比bzmore命令功能更加强大。
### 语法
```
bzless(参数)
```
### 参数
文件:指定要分屏显示的.bz2压缩包。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

21
command/bzmore.md Normal file
View File

@ -0,0 +1,21 @@
bzmore
===
查看bzip2压缩过的文本文件的内容
## 补充说明
**bzmore命令** 用于查看bzip2压缩过的文本文件的内容当下一屏显示不下时可以实现分屏显示。
### 语法
```
bzmore(参数)
```
### 参数
文件:指定要分屏显示的.bz2压缩包。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

35
command/diff3.md Normal file
View File

@ -0,0 +1,35 @@
diff3
===
比较3个文件不同的地方
## 补充说明
**diff3命令** 用于比较3个文件将3个文件的不同的地方显示到标准输出。
### 语法
```
diff3(选项)(参数)
```
### 选项
```
-a把所有的文件都当做文本文件按照行为单位进行比较即给定的文件不是文本文件
-A合并第2个文件和第3个文件之间的不同到第1个文件中有冲突内容用括号括起来
-B与选项“-A”功能相同但是不显示冲突的内容
-e/--ed生成一个“-ed”脚本用于将第2个文件和第3个文件之间的不同合并到第1个文件中
--easy-only除了不显示互相重叠的变化与选项“-e”的功能相同
-i为了和system V系统兼容在“ed”脚本的最后生成“w”和“q”命令。此选项必须和选项“-AeExX3”连用但是不能和“-m”连用
--initial-tab在正常格式的行的文本前输出一个TAB字符而非两个空白字符。此选项将导致在行中TAB字符的对齐方式看上去规范。
```
### 参数
* 文件1指定要比较的第1个文件
* 文件2指定要比较的第2个文件
* 文件3指定要比较的第3个文件。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

40
command/dirname.md Normal file
View File

@ -0,0 +1,40 @@
dirname
===
去除文件名中的非目录部分
## 补充说明
**dirname命令** 去除文件名中的非目录部分仅显示与目录有关的内容。dirname命令读取指定路径名保留最后一个`/`及其后面的字符,删除其他部分,并写结果到标准输出。如果最后一个`<cite>/</cite>`后无字符dirname 命令使用倒数第二个`/`并忽略其后的所有字符。dirname 和 basename 通常在 shell 内部命令替换使用,以指定一个与指定输入文件名略有差异的输出文件名。
### 语法
```
dirname(选项)(参数)
```
### 选项
```
--help显示帮助
--version显示版本号。
```
### 实例
```
dirname //
结果为 /
dirname /a/b/
结果为:/a
dirname a
结果为 .
dirname a/b
结果为路径名 a
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

62
command/dos2unix.md Normal file
View File

@ -0,0 +1,62 @@
dos2unix
===
将DOS格式文本文件转换成Unix格式
## 补充说明
**dos2unix命令** 用来将DOS格式的文本文件转换成UNIX格式的DOS/MAC to UNIX text file format converter。DOS下的文本文件是以`\r\n`作为断行标志的表示成十六进制就是0D 0A。而Unix下的文本文件是以\n作为断行标志的表示成十六进制就是0A。DOS格式的文本文件在Linux底下用较低版本的vi打开时行尾会显示`^M`而且很多命令都无法很好的处理这种格式的文件如果是个shell脚本。而Unix格式的文本文件在Windows下用Notepad打开时会拼在一起显示。因此产生了两种格式文件相互转换的需求对应的将UNIX格式文本文件转成成DOS格式的是unix2dos命令。
### 语法
```
dos2unix [-hkqV] [-c convmode] [-o file ...] [-n infile outfile ...]
```
### 选项
```
-k保持输出文件的日期不变
-q安静模式不提示任何警告信息。
-V查看版本
-c转换模式模式有ASCII, 7bit, ISO, Mac, 默认是ASCII。
-o写入到源文件
-n写入到新文件
```
### 参数
参数:需要转换到文件。
### 实例
最简单的用法就是dos2unix直接跟上文件名
```
dos2unix file
```
如果一次转换多个文件把这些文件名直接跟在dos2unix之后。也可以加上`-o`参数,也可以不加,效果一样)
```
dos2unix file1 file2 file3
dos2unix -o file1 file2 file3
```
上面在转换时,都会直接在原来的文件上修改,如果想把转换的结果保存在别的文件,而源文件不变,则可以使用`-n`参数。
```
dos2unix oldfile newfile
```
如果要保持文件时间戳不变,加上`-k`参数。所以上面几条命令都是可以加上`-k`参数来保持文件时间戳的。
```
dos2unix -k file
dos2unix -k file1 file2 file3
dos2unix -k -o file1 file2 file3
dos2unix -k -n oldfile newfile
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

161
command/emacs.md Normal file
View File

@ -0,0 +1,161 @@
emacs
===
功能强大的全屏文本编辑器
## 补充说明
**emacs命令** 是由GNU组织的创始人Richard Stallman开发的一个功能强大的全屏文本编辑器它支持多种编程语言具有很多优良的特性。有众多的系统管理员和软件开发者使用emacs。
### 语法
```
emacs(选项)(参数)
```
### 选项
```
+<行号>启动emacs编辑器并将光标移动到制定行号的行
-q启动emacs编辑器而不加载初始化文件
-u<用户>启动emacs编辑器时加载指定用户的初始化文件
-t<文件>启动emacs编辑器时把指定的文件作为中端不适用标准输入stdin与标准输出stdout
-f<函数>执行指定lisp广泛应用于人工智能领域的编程语言函数
-l<lisp代码文件>加载指定的lisp代码文件
-batch以批处理模式运行emacs编辑器。
```
### 参数
文件:指定要编辑的文本文件。
## emacs命令操作大全
基本命令
```
C-x C-c : 退出Emacs
C-x C-f : 打开一个文件,如果文件不存在,则创建一个文件
C-g : 取消未完成的命令
```
编辑
```
C-z (redefined): Undo原来C-z是挂起Emacs然后用fg命令调出C-x u 是默认的命令; 移动一下光标再C-z就可以redo
M-d : 删除光标后的词语
```
移动光标
```
C-v : 向前翻页
M-v : 向后翻页
M-r : 将光标移动到屏幕中间那行
C-a : 移到行首
M-a : 移到句首,从行首到句首之间可能有空格
C-e : 移到行尾
M-e : 移到句尾
M-{ : 向上移动一段
M-} : 向下移动一段
C-right : 向前移动一个单词
C-left : 向后移动一个单词
C-up : 向前移动一段
C-down : 向后移动一段
M-< : 移到整个文本开头
M-> : 移到整个文本末尾
C-u 数字 命令 : 执行多次(数字表示次数)该命令;"M-数字 命令" 也可以
M-x goto-line : 移动到某一行
C-l : 重绘屏幕,效果就是当前编辑行移动窗口中央
```
Buffer 相关
```
C-x k : 关闭当前buffer
C-x b : 切换到前一个编辑的buffer
C-x C-b : 列出当前所有buffer
C-x C-s : 保存当前buffer
C-x s : 保存所有未保存的buffer会提示你是否需要保存
C-x C-w : 文件另存为
```
拷贝与粘贴
```
M-space (redefined): 设置mark; C-@ 是默认命令
C-w (redefined) : 剪切一块区域如果没有设置mark则是剪切一行
M-w (redefined) : 拷贝一块区域如果没有设置mark, 则是拷贝一行
C-k : 从当前位置剪切到行尾
C-y : 粘贴
M-y : 用C-y拉回最近被除去的文本后换成 M-y可以拉回以前被除去的文本。键入多次的M-y可以拉回更早以前被除去的文本。
C-x r k : 执行矩形区域的剪切
C-x r y : 执行矩形区域的粘贴
```
```
窗口操作
C-x 0 : 关闭当前窗口
C-x 1 : 将当前窗口最大化
C-x 2 : 垂直分割窗口
C-x 3 : 水平分割窗口
M-o (redefined) : 在窗口之间切换; C-x o 是默认命令
C-x 5 1/2/3/0 : 对frame类似的操作
C-x < : 窗口内容右卷
C-x > : 窗口内容左卷(这两个命令在垂直分割窗口后比较有用)
(C-u) C-x ^ : 加高当前窗口如果有C-u则每次加高4行
(C-u) C-x } : 加宽当前窗口
(C-u) C-x { : 压窄当前窗口
ESC C-v : 在其它窗口进行卷屏操作
```
搜索和替换
```
C-s : 向前搜索增量式搜索连续C-s跳到下一个搜索到的目标
C-s RET : 普通搜索
C-r : 向前搜索
C-s RET C-w : 按单词查询
M-% : 查询替换,也就是替换前会询问一下
M-x replace-string : 普通替换
```
Tags
```
M-! etags .c .h : 创建TAGS文件
M-. : 跳到tag所在位置
M-x list-tags : 列出tags
```
书签
```
C-x r m : 设置书签bookmark
C-x r b : 跳到bookmark处
```
帮助
```
C-h ? : 查看帮助信息
C-h f : 查看一个函数
C-h v : 查看一个变量
C-h k : 查看一个键绑定 (Ch c 也是查看键绑定,但是信息较简略)
C-h C-f : 查看一个函数的info非常有用
C-h i : 看Info
```
其它
```
C-M-\ : 对选中区域,按照某种格式(比如C程序)进行格式化
C-x h : 全部选中
M-! : 执行外部shell命令
M-x shell : 模拟shell的buffer
M-x term : 模拟terminal, C-c k 关闭terminal
C-x C-q : 修改buffer的只读属性
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

27
command/expand.md Normal file
View File

@ -0,0 +1,27 @@
expand
===
将文件的制表符转换为空白字符
## 补充说明
**expand命令** 用于将文件的制表符TAB转换为空白字符space将结果显示到标准输出设备。
### 语法
```
expand(选项)(参数)
```
### 选项
```
-t<数字>指定制表符所代表的空白字符的个数而不使用默认的8。
```
### 参数
文件:指定要转换制表符为空白的文件。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

30
command/head.md Normal file
View File

@ -0,0 +1,30 @@
head
===
在屏幕上显示指定文件的开头若干行
## 补充说明
**head命令** 用于显示文件的开头的内容。在默认情况下head命令显示文件的头10行内容。
### 语法
```
head(选项)(参数)
```
### 选项
```
-n<数字>:指定显示头部内容的行数;
-c<字符数>:指定显示头部内容的字符数;
-v总是显示文件名的头信息
-q不显示文件名的头信息。
```
### 参数
文件列表:指定显示头部内容的文件列表。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

60
command/hexdump.md Normal file
View File

@ -0,0 +1,60 @@
hexdump
===
显示文件十六进制格式
## 补充说明
**hexdump命令** 一般用来查看“二进制”文件的十六进制编码,但实际上它能查看任何文件,而不只限于二进制文件。
### 语法
```
hexdump [选项] [文件]...
```
### 选项
```
-n length 只格式化输入文件的前length个字节。
-C 输出规范的十六进制和ASCII码。
-b 单字节八进制显示。
-c 单字节字符显示。
-d 双字节十进制显示。
-o 双字节八进制显示。
-x 双字节十六进制显示。
-s 从偏移量开始输出。
-e 指定格式字符串,格式字符串包含在一对单引号中,格式字符串形如:'a/b "format1" "format2"'。
```
每个格式字符串由三部分组成每个由空格分隔第一个形如a/bb表示对每b个输入字节应用format1格式a表示对每a个输入字节应用format2格式一般a>b且b只能为124另外a可以省略省略则a=1。format1和format2中可以使用类似printf的格式字符串
```
%02d两位十进制
%03x三位十六进制
%02o两位八进制
%c单个字符等
```
还有一些特殊的用法:
```
%_ad标记下一个输出字节的序号用十进制表示。
%_ax标记下一个输出字节的序号用十六进制表示。
%_ao标记下一个输出字节的序号用八进制表示。
%_p对不能以常规字符显示的用 . 代替。
```
同一行如果要显示多个格式字符串,则可以跟多个`-e`选项。
### 实例
```
hexdump -e '16/1 "%02X " " | "' -e '16/1 "%_p" "\n"' test
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | ................
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F | ................
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F | !"#$%&'()*+,-./
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

46
command/iconv.md Normal file
View File

@ -0,0 +1,46 @@
iconv
===
转换文件的编码方式
## 补充说明
**iconv命令** 是用来转换文件的编码方式的比如它可以将UTF8编码的转换成GB18030的编码反过来也行。JDK中也提供了类似的工具native2ascii。Linux下的iconv开发库包括iconv_open,iconv_close,iconv等C函数可以用来在C/C++程序中很方便的转换字符编码这在抓取网页的程序中很有用处而iconv命令在调试此类程序时用得着。
### 语法
```
iconv -f encoding [-t encoding] [inputfile]...
```
### 选项
```
-f encoding :把字符从encoding编码开始转换。
-t encoding :把字符转换到encoding编码。
-l :列出已知的编码字符集合
-o file :指定输出文件
-c :忽略输出的非法字符
-s :禁止警告信息,但不是错误信息
--verbose :显示进度信息
-f和-t所能指定的合法字符在-l选项的命令里面都列出来了。
```
### 实例
列出当前支持的字符编码: 
```
iconv -l
```
将文件file1转码转后文件输出到fil2中 
```
iconv file1 -f EUC-JP-MS -t UTF-8 -o file2
```
这里,没`-o`那么会输出到标准输出。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

81
command/install.md Normal file
View File

@ -0,0 +1,81 @@
install
===
安装或升级软件或备份数据
## 补充说明
**install命令** 的作用是安装或升级软件或备份数据它的使用权限是所有用户。install命令和cp命令类似都可以将文件/目录拷贝到指定的地点。但是install允许你控制目标文件的属性。install通常用于程序的makefile使用它来将程序拷贝到目标安装目录。
### 语法
```
install [OPTION]... [-T] SOURCE DEST
install [OPTION]... SOURCE... DIRECTORY
install [OPTION]... -t DIRECTORY SOURCE...
install [OPTION]... -d DIRECTORY...
```
在前两种格式中,会将<来源>复制至<目的地>或将多个<来源>文件复制至已存在的<目录>,同时设定权限模式及所有者/所属组。在第三种格式中,会创建所有指定的目录及它们的主目录。长选项必须用的参数在使用短选项时也是必须的。
### 选项
```
--backup[=CONTROL]:为每个已存在的目的地文件进行备份。
-b类似 --backup但不接受任何参数。
-c(此选项不作处理)。
-d--directory所有参数都作为目录处理而且会创建指定目录的所有主目录。
-D创建<目的地>前的所有主目录,然后将<来源>复制至 <目的地>;在第一种使用格式中有用。
-g--group=组:自行设定所属组,而不是进程目前的所属组。
-m--mode=模式:自行设定权限模式 (像chmod)而不是rwxr-xr-x。
-o--owner=所有者:自行设定所有者 (只适用于超级用户)。
-p--preserve-timestamps<来源>文件的访问/修改时间作为相应的目的地文件的时间属性。
-s--strip用strip命令删除symbol table只适用于第一及第二种使用格式。
-S--suffix=后缀:自行指定备份文件的<后缀>
-v--verbose处理每个文件/目录时印出名称。
--help显示此帮助信息并离开。
--version显示版本信息并离开。
```
### 实例
```
install -d [option] DIRECTORY [DIRECTORY...]
```
支持多个,类似`mkdir -p`支持递归。例如:`install -d a/b/c e/f`结果和`mkdir -p a/b/c e/f`一样。
```
install [option] SOURCE DEST
```
**复制SOURCE文件测试不能是目录到DEST file文件**
```
install a/e c
结果类似:
cp a/e c #注意c必须是文件
```
**有用选项`-D`**
```
install -D x a/b/c
效果类似:
mkdir -p a/b && cp x a/b/c
```
```
install [option] SOURCE [SOURCE...] DIRECTORY
```
**复制多个SOURCE文件到目的目录**
```
install a/* d
```
其中d是目录。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

34
command/less.md Normal file
View File

@ -0,0 +1,34 @@
less
===
分屏上下翻页浏览文件内容
## 补充说明
**less命令** 的作用与more十分相似都可以用来浏览文字档案的内容不同的是less命令允许用户向前或向后浏览文件而more命令只能向前浏览。用less命令显示文件时用PageUp键向上翻页用PageDown键向下翻页。要退出less程序应按Q键。
### 语法
```
less(选项)(参数)
```
### 选项
```
-e文件内容显示完毕后自动退出
-f强制显示文件
-g不加亮显示搜索到的所有关键词仅显示当前显示的关键字以提高显示速度
-l搜索时忽略大小写的差异
-N每一行行首显示行号
-s将连续多个空行压缩成一行显示
-S在单行显示较长的内容而不换行显示
-x<数字>将TAB字符显示为指定个数的空格字符。
```
### 参数
文件:指定要分屏显示内容的文件。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

55
command/more.md Normal file
View File

@ -0,0 +1,55 @@
more
===
显示文件内容,每次显示一屏
## 补充说明
**more命令** 是一个基于vi编辑器文本过滤器它以全屏幕的方式按页显示文本文件的内容支持vi中的关键字定位操作。more名单中内置了若干快捷键常用的有H获得帮助信息Enter向下翻滚一行空格向下滚动一屏Q退出命令
该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比:--More--XX%)可以用下列不同的方法对提示做出回答:
* 按Space键显示文本的下一屏内容。
* 按Enier键只显示文本的下一行内容。
* 按斜线符`|`:接着输入一个模式,可以在文本中寻找下一个相匹配的模式。
* 按H键显示帮助屏该屏上有相关的帮助信息。
* 按B键显示上一屏内容。
* 按Q键退出rnore命令。
### 语法
```
more(语法)(参数)
```
### 选项
```
-<数字>:指定每屏显示的行数;
-d显示“[press space to continue,'q' to quit.]”和“[Press 'h' for instructions]”;
-c不进行滚屏操作。每次刷新这个屏幕
-s将多个空行压缩成一行显示
-u禁止下划线
+<数字>:从指定数字的行开始显示。
```
### 参数
文件:指定分页显示内容的文件。
### 实例
显示文件file的内容但在显示之前先清屏并且在屏幕的最下方显示完核的百分比。
```
more -dc file
```
显示文件file的内容每10行显示一次而且在显示之前先清屏。
```
more -c -10 file
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

101
command/nano.md Normal file
View File

@ -0,0 +1,101 @@
nano
===
字符终端文本编辑器
## 补充说明
**nano** 是一个字符终端的文本编辑器有点像DOS下的editor程序。它比vi/vim要简单得多比较适合Linux初学者使用。某些Linux发行版的默认编辑器就是nano。
nano命令可以打开指定文件进行编辑默认情况下它会自动断行即在一行中输入过长的内容时自动拆分成几行但用这种方式来处理某些文件可能会带来问题比如Linux系统的配置文件自动断行就会使本来只能写在一行上的内容折断成多行了有可能造成系统不灵了。因此如果你想避免这种情况出现就加上`-w`选项吧。
### 语法
```
nano [选项] [[+行,列] 文件名]...
```
### 选项
```
-h, -? --help 显示此信息
+行,列 从所指列数与行数开始
-A --smarthome 启用智能 HOME 键
-B --backup 储存既有文件的备份
-C <目录> --backupdir=<目录> 用以储存独一备份文件的目录
-D --boldtext 用粗体替代颜色反转
-E --tabstospaces 将已输入的制表符转换为空白
-F --multibuffer 启用多重文件缓冲区功能
-H --historylog 记录与读取搜索/替换的历史字符串
-I --ignorercfiles 不要参考nanorc 文件
-K --rebindkeypad 修正数字键区按键混淆问题
-L --nonewlines 不要将换行加到文件末端
-N --noconvert 不要从 DOS/Mac 格式转换
-O --morespace 编辑时多使用一行
-Q <字符串> --quotestr=<字符串> 引用代表字符串
-R --restricted 限制模式
-S --smooth 按行滚动而不是半屏
-T <#列数> --tabsize=<#列数> 设定制表符宽度为 #列数
-U --quickblank 状态行快速闪动
-V --version 显示版本资讯并离开
-W --wordbounds 更正确地侦测单字边界
-Y <字符串> --syntax=<字符串> 用于加亮的语法定义
-c --const 持续显示游标位置
-d --rebinddelete 修正退格键/删除键混淆问题
-i --autoindent 自动缩进新行
-k --cut 从游标剪切至行尾
-l --nofollow 不要依照符号连结,而是覆盖
-m --mouse 启用鼠标功能
-o <目录> --operatingdir=<目录> 设定操作目录
-p --preserve 保留XON (^Q) 和XOFF (^S) 按键
-q --quiet 沉默忽略启动问题, 比如rc 文件错误
-r <#列数> --fill=<#列数> 设定折行宽度为 #列数
-s <程序> --speller=<程序> 启用替代的拼写检查程序
-t --tempfile 离开时自动储存,不要提示
-u --undo 允许通用撤销[试验性特性]
-v --view 查看(只读)模式
-w --nowrap 不要自动换行
-x --nohelp 不要显示辅助区
-z --suspend 启用暂停功能
-$ --softwrap 启用软换行
-a, -b, -e,
-f, -g, -j (忽略为与pico 相容)
```
### 用法
**光标控制**
* 移动光标:使用用方向键移动。
* 选择文字:按住鼠标左键拖到。
**复制、剪贴和粘贴**
* 复制一整行Alt+6
* 剪贴一整行Ctrl+K
**粘贴Ctrl+U**
如果需要复制剪贴多行或者一行中的一部分先将光标移动到需要复制剪贴的文本的开头按Ctrl+6或者Alt+A做标记然后移动光标到 待复制剪贴的文本末尾。这时选定的文本会反白用Alt+6来复制Ctrl+K来剪贴。若在选择文本过程中要取消只需要再按一次Ctrl+6。
**搜索**
按Ctrl+W然后输入你要搜索的关键字回车确定。这将会定位到第一个匹配的文本接着可以用Alt+W来定位到下一个匹配的文本。
**翻页**
* Ctrl+Y到上一页
* Ctrl+V到下一页
**保存**
使用Ctrl+O来保存所做的修改
**退出**
按Ctrl+X
如果你修改了文件下面会询问你是否需要保存修改。输入Y确认保存输入N不保存按Ctrl+C取消返回。如果输入了Y下一步会让你输入想要保存的文件名。如果不需要修改文件名直接回车就行若想要保存成别的名字也就是另存为则输入新名称然后确 定。这个时候也可用Ctrl+C来取消返回。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

94
command/nl.md Normal file
View File

@ -0,0 +1,94 @@
nl
===
在Linux系统中计算文件内容行号
## 补充说明
**nl命令** 读取 file 参数缺省情况下标准输入计算输入中的行号将计算过的行号写入标准输出。在输出中nl命令根据您在命令行中指定的标志来计算左边的行。输入文本必须写在逻辑页中。每个逻辑页有头、主体和页脚节可以有空节。除非使用`-p`选项nl 命令在每个逻辑页开始的地方重新设置行号。可以单独为头、主体和页脚节设置行计算标志(例如,头和页脚行可以被计算然而文本行不能)。其默认的结果与`cat -n`有点不太一样, nl 可以将行号做比较多的显示设计包括位数与是否自动补齐0等等的功能。
### 语法
```
nl (选项) (参数)
```
### 选项
```
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n)
-b t :如果有空行,空的那一行不要列出行号(默认值)
-n :列出行号表示的方法,主要有三种:
-n ln :行号在萤幕的最左方显示;
-n rn :行号在自己栏位的最右方显示,且不加 0
-n rz :行号在自己栏位的最右方显示,且加 0
-w :行号栏位的占用的位数。
-p :在逻辑定界符处不重新开始计算。
```
### 实例
**用 nl 列出 log2015.log 的内容**
```
root@localhost [test]# nl log2015.log
1 2015-01
2 2015-02
3 ======[root@localhost test]#
```
说明文件中的空白行nl 不会加上行号
**用 nl 列出 log2015.log 的内容,空本行也加上行号**
```
[root@localhost test]# nl -b a log2015.log
1 2015-01
2 2015-02
3
4
5 ======[root@localhost test]#
```
**让行号前面自动补上0统一输出格式**
```
[root@localhost test]# nl -b a -n rz log2015.log
000001 2015-01
000002 2015-02
000003 2015-03
000004 2015-04
000005 2015-05
000006 2015-06
000007 2015-07
000008 2015-08
000009 2015-09
000010 2015-10
000011 2015-11
000012 2015-12
000013 =======
[root@localhost test]# nl -b a -n rz -w 3 log2015.log
001 2015-01
002 2015-02
003 2015-03
004 2015-04
005 2015-05
006 2015-06
007 2015-07
008 2015-08
009 2015-09
010 2015-10
011 2015-11
012 2015-12
013 =======
```
说明:`nl -b a -n rz`命令行号默认为六位,要调整位数可以加上参数`-w 3`调整为3位。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

32
command/pathchk.md Normal file
View File

@ -0,0 +1,32 @@
pathchk
===
检查文件中不可移植的部分
## 补充说明
**pathchk命令** 用来检查文件中不可移植的部分。
### 语法
```
pathchk(选项)(参数)
```
### 选项
```
-p检查大多数的POSIX系统
-P检查空名字和“-”开头的文件;
--portability检查所有的POSIX系统等同于“-P-p”选项
--help显示帮助
--wersion显示版本号。
```
### 参数
* 文件:带路径信息的文件;
* 后缀:可选参数,指定要去除的文件后缀字符串。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

41
command/popd.md Normal file
View File

@ -0,0 +1,41 @@
popd
===
用于删除目录栈中的记录
## 补充说明
**popd命令** 用于删除目录栈中的记录如果popd命令不加任何参数则会先删除目录栈最上面的记录然后切换到删除过后的目录栈中的最上面的目录。
### 语法
```
pushd(选项)(参数)
```
### 选项
```
+N将第N个目录删除从左边数起数字从0开始
-N将第N个目录删除从右边数起数字从0开始
-n将目录出栈时不切换目录。
```
### 实例
```
root@Mylinux:/tmp/dir4# popd相当于popd +0
/tmp/dir3 /tmp/dir2 /tmp/dir1 ~
root@Mylinux:/tmp/dir3# pushd /tmp/dir4
/tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1 ~
root@Mylinux:/tmp/dir4# popd +1
/tmp/dir4 /tmp/dir2 /tmp/dir1 ~
root@Mylinux:/tmp/dir4# popd -2
/tmp/dir4 /tmp/dir1 ~
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

28
command/pr.md Normal file
View File

@ -0,0 +1,28 @@
pr
===
将文本文件转换成适合打印的格式
## 补充说明
**pr命令** 用来将文本文件转换成适合打印的格式,它可以把较大的文件分割成多个页面进行打印,并为每个页面添加标题。
### 语法
```
pr(选项)(参数)
```
### 选项
```
-h<标题>:为页指定标题;
-l<行数>:指定每页的行数。
```
### 参数
文件:需要转换格式的文件。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

73
command/printf.md Normal file
View File

@ -0,0 +1,73 @@
printf
===
格式化并输出结果
## 补充说明
**printf命令** 格式化并输出结果到标准输出。
### 语法
```
printf(选项)(参数)
--help在线帮助
--version显示版本信息。
```
### 参数
* 输出格式:指定数据输出时的格式;
* 输出字符串:指定要输出的数据。
**格式替代符**
* %b 相对应的参数被视为含有要被处理的转义序列之字符串。
* %c ASCII字符。显示相对应参数的第一个字符
* %d, %i 十进制整数
* %e, %E, %f 浮点格式
* %g %e或%f转换看哪一个较短则删除结尾的零
* %G %E或%f转换看哪一个较短则删除结尾的零
* %o 不带正负号的八进制值
* %s 字符串
* %u 不带正负号的十进制值
* %x 不带正负号的十六进制值使用a至f表示10至15
* %X 不带正负号的十六进制值使用A至F表示10至15
* %% 字面意义的%
**转义序列**
* \a 警告字符通常为ASCII的BEL字符
* \b 后退
* \c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效而且任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符都被忽略
* \f 换页formfeed
* \n 换行
* \r 回车Carriage return
* \t 水平制表符
* \v 垂直制表符
* \\ 一个字面上的反斜杠字符
* \ddd 表示1到3位数八进制值的字符仅在格式字符串中有效
* \0ddd 表示1到3位的八进制值字符
### 实例
```
printf "hello world"
```
```
#!/bin/bash
printf "%-5s %-10s %-4s\n" NO Name Mark
printf "%-5s %-10s %-4.2f\n" 01 Tom 90.3456
printf "%-5s %-10s %-4.2f\n" 02 Jack 89.2345
printf "%-5s %-10s %-4.2f\n" 03 Jeff 98.4323
```
* %-5s 格式为左对齐且宽度为5的字符串代替-表示左对齐),不使用则是又对齐。
* %-4.2f 格式为左对齐宽度为4保留两位小数。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

44
command/pushd.md Normal file
View File

@ -0,0 +1,44 @@
pushd
===
将目录加入命令堆叠中
## 补充说明
**pushd命令** 是将目录加入命令堆叠中。如果指令没有指定目录名称,则会将当前的工作目录置入目录堆叠的最顶端。置入目录如果没有指定堆叠的位置,也会置入目录堆叠的最顶端,同时工作目录会自动切换到目录堆叠最顶端的目录去。
### 语法
```
pushd(选项)(参数)
```
### 选项
```
-n只加入目录到堆叠中不进行cd操作
+n删除从左到右的第n个目录数字从0开始
-n删除从右到左的第n个目录数字从0开始
```
### 参数
目录:需要压入堆栈的目录。
### 实例
```
root@Mylinux:/tmp/dir4# pushd /tmp/dir3
/tmp/dir3 /tmp/dir4 /tmp/dir1 ~
root@Mylinux:/tmp/dir3# pushd /tmp/dir2
/tmp/dir2 /tmp/dir3 /tmp/dir4 /tmp/dir1 ~
root@Mylinux:/tmp/dir2# pushd -1
/tmp/dir1 ~ /tmp/dir2 /tmp/dir3 /tmp/dir4
```
注意:最左边表示栈顶,最右边表示栈底。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

77
command/rename.md Normal file
View File

@ -0,0 +1,77 @@
rename
===
用字符串替换的方式批量改变文件名
## 补充说明
**rename命令** 用字符串替换的方式批量改变文件名。
### 语法
```
rename(参数)
```
### 参数
```
原字符串:将文件名需要替换的字符串;
目标字符串:将文件名中含有的原字符替换成目标字符串;
文件:指定要改变文件名的文件列表。
```
### 实例
将main1.c重命名为main.c
```
rename main1.c main.c main1.c
```
**rename支持通配符**
```
? 可替代单个字符
* 可替代多个字符
[charset] 可替代charset集中的任意单个字符
```
文件夹中有这些文件foo1, ..., foo9, foo10, ..., foo278
如果使用`rename foo foo0 foo?`会把foo1到foo9的文件重命名为foo01到foo09重命名的文件只是有4个字符长度名称的文件文件名中的foo被替换为foo0。
如果使用`rename foo foo0 foo??`foo01到foo99的所有文件都被重命名为foo001到foo099只重命名5个字符长度名称的文件文件名中的foo被替换为foo0。
如果使用`rename foo foo0 foo*`foo001到foo278的所有文件都被重命名为foo0001到foo0278所有以foo开头的文件都被重命名。
如果使用`rename foo0 foo foo0[2]*`从foo0200到foo0278的所有文件都被重命名为foo200到foo278文件名中的foo0被替换为foo。
**rename支持正则表达式**
字母的替换
```
rename "s/AA/aa/" * //把文件名中的AA替换成aa
```
修改文件的后缀
```
rename "s//.html//.php/" * //把.html 后缀的改成 .php后缀
```
批量添加文件后缀
```
rename "s/$//.txt/" * //把所有的文件名都以txt结尾
```
批量删除文件名
```
rename "s//.txt//" * //把所有以.txt结尾的文件名的.txt删掉
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

55
command/rev.md Normal file
View File

@ -0,0 +1,55 @@
rev
===
将文件内容以字符为单位反序输出
## 补充说明
**rev命令** 将文件中的每行内容以字符为单位反序输出,即第一个字符最后输出,最后一个字符最先输出,依次类推。
### 语法
```
rev(参数)
```
### 参数
文件:指定要反序显示内容的文件。
### 实例
```
[root@localhost ~]# cat iptables.bak
# Generated by iptables-save v1.3.5 on Thu Dec 26 21:25:15 2013
*filter
:INPUT DROP [48113:2690676]
:FORWARD accept [0:0]
:OUTPUT ACCEPT [3381959:1818595115]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Thu Dec 26 21:25:15 2013
[root@localhost ~]# rev iptables.bak
3102 51:52:12 62 ceD uhT no 5.3.1v evas-selbatpi yb detareneG #
retlif*
]6760962:31184[ PORD TUPNI:
]0:0[ TPECCA DRAWROF:
]5115958181:9591833[ TPECCA TUPTUO:
TPECCA j- ol i- TUPNI A-
TPECCA j- 22 tropd-- pct m- pct p- TUPNI A-
TPECCA j- 08 tropd-- pct m- pct p- TUPNI A-
TPECCA j- DEHSILBATSE,DETALER etats-- etats m- TUPNI A-
TPECCA j- pmci p- TUPNI A-
TPECCA j- ol o- TUPTUO A-
TIMMOC
3102 51:52:12 62 ceD uhT no detelpmoC #
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

76
command/scp.md Normal file
View File

@ -0,0 +1,76 @@
scp
===
加密的方式在本地主机和远程主机之间复制文件
## 补充说明
**scp命令** 用于在Linux下进行远程拷贝文件的命令和它类似的命令有cp不过cp只是在本机进行拷贝不能跨服务器而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读read only system时用scp可以帮你把文件移出来。另外scp还非常不占资源不会提高多少系统负荷在这一点上rsync就远远不及它了。虽然 rsync比scp会快一点但当小文件众多的情况下rsync会导致硬盘I/O非常高而scp基本不影响系统正常使用。
### 语法
```
scp(选项)(参数)
```
### 选项
```
-1使用ssh协议版本1
-2使用ssh协议版本2
-4使用ipv4
-6使用ipv6
-B以批处理模式运行
-C使用压缩
-F指定ssh配置文件
-l指定宽带限制
-o指定使用的ssh选项
-P指定远程主机的端口号
-p保留文件的最后修改时间最后访问时间和权限模式
-q不显示复制进度
-r以递归方式复制。
```
### 参数
* 源文件:指定要复制的源文件。
* 目标文件:目标文件。格式为`user@hostfilename`(文件名为目标文件的名称)。
### 实例
从远程复制到本地的scp命令与上面的命令雷同只要将从本地复制到远程的命令后面2个参数互换顺序就行了。
**从远处复制文件到本地目录**
```
scp root@10.10.10.10:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/
```
从10.10.10.10机器上的`/opt/soft/`的目录中下载nginx-0.5.38.tar.gz 文件到本地`/opt/soft/`目录中。
**从远处复制到本地**
```
scp -r root@10.10.10.10:/opt/soft/mongodb /opt/soft/
```
从10.10.10.10机器上的`/opt/soft/`中下载mongodb目录到本地的`/opt/soft/`目录来。
**上传本地文件到远程机器指定目录**
```
scp /opt/soft/nginx-0.5.38.tar.gz root@10.10.10.10:/opt/soft/scptest
```
复制本地`/opt/soft/`目录下的文件nginx-0.5.38.tar.gz到远程机器10.10.10.10的`opt/soft/scptest`目录。
**上传本地目录到远程机器指定目录**
```
scp -r /opt/soft/mongodb root@10.10.10.10:/opt/soft/scptest
```
上传本地目录`/opt/soft/mongodb`到远程机器10.10.10.10上`/opt/soft/scptest`的目录中去。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

282
command/setfacl.md Normal file
View File

@ -0,0 +1,282 @@
setfacl
===
设置文件访问控制列表
## 补充说明
**setfacl命令** 是用来在命令行里设置ACL访问控制列表。在命令行里一系列的命令跟随以一系列的文件名。
### 选项
```
-b,--remove-all删除所有扩展的acl规则基本的acl规则(所有者,群组,其他)将被保留。
-k,--remove-default删除缺省的acl规则。如果没有缺省规则将不提示。
-n--no-mask不要重新计算有效权限。setfacl默认会重新计算ACL mask除非mask被明确的制定。
--mask重新计算有效权限即使ACL mask被明确指定。
-d--default设定默认的acl规则。
--restore=file从文件恢复备份的acl规则这些文件可由getfacl -R产生。通过这种机制可以恢复整个目录树的acl规则。此参数不能和除--test以外的任何参数一同执行。
--test测试模式不会改变任何文件的acl规则操作后的acl规格将被列出。
-R--recursive递归的对所有文件及目录进行操作。
-L--logical跟踪符号链接默认情况下只跟踪符号链接文件跳过符号链接目录。
-P--physical跳过所有符号链接包括符号链接文件。
--version输出setfacl的版本号并退出。
--help输出帮助信息。
--:标识命令行参数结束,其后的所有参数都将被认为是文件名
-:如果文件名是-则setfacl将从标准输入读取文件名。
```
* 选项`-m`和`-x`后边跟以acl规则。多条acl规则以逗号(,)隔开。选项`-M`和`-X`用来从文件或标准输入读取acl规则。
* 选项`--set`和`--set-file`用来设置文件或目录的acl规则先前的设定将被覆盖。
* 选项`-m(--modify)`和`-M(--modify-file)`选项修改文件或目录的acl规则。
* 选项`-x(--remove)`和`-X(--remove-file)`选项删除acl规则。
当使用-M-X选项从文件中读取规则时setfacl接受getfacl命令输出的格式。每行至少一条规则以#开始的行将被视为注释。
当在不支持ACLs的文件系统上使用setfacl命令时setfacl将修改文件权限位。如果acl规则并不完全匹配文件权限位setfacl将会修改文件权限位使其尽可能的反应acl规则并会向standard error发送错误消息以大于0的状态返回。
**权限**
文件的所有者以及有`CAP_FOWNER`的用户进程可以设置一个文件的acl。在目前的linux系统上root用户是唯一有`CAP_FOWNER`能力的用户)
**ACL规则**
setfacl命令可以识别以下的规则格式
```
[d[efault]:] [u[ser]:]uid [:perms] 指定用户的权限文件所有者的权限如果uid没有指定
[d[efault]:] g[roup]:gid [:perms] 指定群组的权限文件所有群组的权限如果gid未指定
[d[efault]:] m[ask][:] [:perms] 有效权限掩码
[d[efault]:] o[ther] [:perms] 其他的权限
```
恰当的acl规则被用在修改和设定的操作中对于uid和gid可以指定一个数字也可指定一个名字。perms域是一个代表各种权限的字母的组合读`-r`写`-w`执行`-x`执行只适合目录和一些可执行的文件。pers域也可设置为八进制格式。
**自动创建的规则**
最初的文件目录仅包含3个基本的acl规则。为了使规则能正常执行需要满足以下规则。
* 3个基本规则不能被删除。
* 任何一条包含指定的用户名或群组名的规则必须包含有效的权限组合。
* 任何一条包含缺省规则的规则在使用时,缺省规则必须存在。
**ACL的名词定义**
先来看看在ACL里面每一个名词的定义这些名词我大多从man page上摘下来虽然有些枯燥,但是对于理解下面的内容还是很有帮助的。
ACL是由一系列的Access Entry所组成的每一条Access Entry定义了特定的类别可以对文件拥有的操作权限。Access Entry有三个组成部分Entry tag type, qualifier (optional), permission。
我们先来看一下最重要的Entry tag type它有以下几个类型
```
ACL_USER_OBJ相当于Linux里file_owner的permission
ACL_USER定义了额外的用户可以对此文件拥有的permission
ACL_GROUP_OBJ相当于Linux里group的permission
ACL_GROUP定义了额外的组可以对此文件拥有的permission
ACL_MASK定义了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限 (这个我下面还会专门讨论)
ACL_OTHER相当于Linux里other的permission
```
让我们来据个例子说明一下下面我们就用getfacl命令来查看一个定义好了的ACL文件
```
[root@localhost ~]# getfacl ./test.txt
# file: test.txt
# owner: root
# group: admin
user::rw-
user:john:rw-
group::rw-
group:dev:r--
mask::rw- other::r--
```
前面三个以#开头的定义了文件名file owner和group。这些信息没有太大的作用接下来我们可以用`--omit-header`来省略掉。
```
user::rw- 定义了ACL_USER_OBJ, 说明file owner拥有read and write permission
user:john:rw- 定义了ACL_USER,这样用户john就拥有了对文件的读写权限,实现了我们一开始要达到的目的
group::rw- 定义了ACL_GROUP_OBJ,说明文件的group拥有read and write permission
group:dev:r-- 定义了ACL_GROUP,使得dev组拥有了对文件的read permission
mask::rw- 定义了ACL_MASK的权限为read and write
other::r-- 定义了ACL_OTHER的权限为read
```
从这里我们就可以看出ACL提供了我们可以定义特定用户和用户组的功能那么接下来我们就来看一下如何设置一个文件的ACL
**如何设置ACL文件**
首先我们还是要讲一下设置ACL文件的格式从上面的例子中我们可以看到每一个Access Entry都是由三个被号分隔开的字段所组成第一个就是Entry tag type。
```
user 对应了ACL_USER_OBJ和ACL_USER
group 对应了ACL_GROUP_OBJ和ACL_GROUP
mask 对应了ACL_MASK
other 对应了ACL_OTHER
```
第二个字段称之为qualifier也就是上面例子中的john和dev组它定义了特定用户和拥护组对于文件的权限。这里我们也可以发现只有user和group才有qualifier其他的都为空。第三个字段就是我们熟悉的permission了。它和Linux的permission一样定义这里就不多讲了。
下面我们就来看一下怎么设置test.txt这个文件的ACL让它来达到我们上面的要求。
一开始文件没有ACL的额外属性
```
[root@localhost ~]# ls -l
-rw-rw-r-- 1 root admin 0 Jul 3 22:06 test.txt
[root@localhost ~]# getfacl --omit-header ./test.txt
user::rw- group::rw- other::r--
```
我们先让用户john拥有对test.txt文件的读写权限
```
[root@localhost ~]# setfacl -m user:john:rw- ./test.txt
[root@localhost ~]# getfacl --omit-header ./test.txt
user::rw-
user:john:rw-
group::rw-
mask::rw-
other::r--
```
这时我们就可以看到john用户在ACL里面已经拥有了对文件的读写权。这个时候如果我们查看一下linux的permission我们还会发现一个不一样的地方。
```
[root@localhost ~]# ls -l ./test.txt
-rw-rw-r--+ 1 root admin 0 Jul 3 22:06 ./test.txt
```
在文件permission的最后多了一个+号当任何一个文件拥有了ACL_USER或者ACL_GROUP的值以后我们就可以称它为ACL文件这个+号就是用来提示我们的。我们还可以发现当一个文件拥有了`ACL_USER`或者`ACL_GROUP`的值时`ACL_MASK`同时也会被定义。
接下来我们来设置dev组拥有read permission
```
[root@localhost ~]# setfacl -m group:dev:r-- ./test.txt
[root@localhost ~]# getfacl --omit-header ./test.txt
user::rw-
user:john:rw-
group::rw-
group:dev:r--
mask::rw-
other::r--
```
到这里就完成了我们上面讲到的要求,是不是很简单呢。
**ACL_MASK和Effective permission**
这里需要重点讲一下`ACL_MASK`因为这是掌握ACL的另一个关键在Linux file permission里面大家都知道比如对于`rw-rw-r--`来说, 当中的那个`rw-`是指文件组的permission. 但是在ACL里面这种情况只是在`ACL_MASK`不存在的情况下成立。如果文件有ACL_MASK值那么当中那个`rw-`代表的就是mask值而不再是group permission了。
让我们来看下面这个例子:
```
[root@localhost ~]# ls -l
-rwxrw-r-- 1 root admin 0 Jul 3 23:10 test.sh
```
这里说明test.sh文件只有file owner: root拥有read, write, execute/search permission。admin组只有read and write permission现在我们想让用户john也对test.sh具有和root一样的permission。
```
[root@localhost ~]# setfacl -m user:john:rwx ./test.sh
[root@localhost ~]# getfacl --omit-header ./test.sh
user::rwx user:john:rwx
group::rw-
mask::rwx
other::r--
```
这里我们看到john已经拥有了rwx的permissionmask值也被设定为rwx那是因为它规定了`ACL_USER``ACL_GROUP`和`ACL_GROUP_OBJ`的最大值现在我们再来看test.sh的Linux permission它已经变成了
```
[root@localhost ~]# ls -l
-rwxrwxr--+ 1 root admin 0 Jul 3 23:10 test.sh
```
那么如果现在admin组的用户想要执行test.sh的程序会发生什么情况呢它会被permission deny。原因在于实际上admin组的用户只有read and write permission这里当中显示的rwx是`ACL_MASK`的值而不是group的permission。
所以从这里我们就可以知道,如果一个文件后面有+标记我们都需要用getfacl来确认它的permission以免发生混淆。
下面我们再来继续看一个例子假如现在我们设置test.sh的mask为read only那么admin组的用户还会有write permission吗
```
[root@localhost ~]# setfacl -m mask::r-- ./test.sh
[root@localhost ~]# getfacl --omit-header ./test.sh
user::rwx
user:john:rwx #effective:r--
group::rw- #effective:r--
mask::r--
other::r--
```
这时候我们可以看到ACL_USER和ACL_GROUP_OBJ旁边多了个#effective:r--,这是什么意思呢?让我们再来回顾一下`ACL_MASK`的定义。它规定了`ACL_USER``ACL_GROUP_OBJ`和`ACL_GROUP`的最大权限。那么在我们这个例子中他们的最大权限也就是read only。虽然我们这里给`ACL_USER`和`ACL_GROUP_OBJ`设置了其他权限但是他们真正有效果的只有read权限。
这时我们再来查看test.sh的Linux file permission时它的group permission也会显示其mask的值(i.e. r--)
```
[root@localhost ~]# ls -l
-rwxr--r--+ 1 root admin 0 Jul 3 23:10 test.sh
```
**Default ACL**
上面我们所有讲的都是Access ACL也就是对文件而言。下面我简单讲一下Default ACL。Default ACL是指对于一个目录进行Default ACL设置并且在此目录下建立的文件都将继承此目录的ACL。
同样我们来做一个试验说明比如现在root用户建立了一个dir目录
```
[root@localhost ~]# mkdir dir
```
他希望所有在此目录下建立的文件都可以被john用户所访问那么我们就应该对dir目录设置Default ACL。
```
[root@localhost ~]# setfacl -d -m user:john:rw ./dir
[root@localhost ~]# getfacl --omit-header ./dir
user::rwx
group::rwx
other::r-x
default:user::rwx
default:user:john:rwx
default:group::rwx
default:mask::rwx
default: other::r-x
```
这里我们可以看到ACL定义了default选项john用户拥有了default的read, write, excute/search permission。所有没有定义的default都将从file permission里copy过来现在root用户在dir下建立一个test.txt文件。
```
[root@localhost ~]# touch ./dir/test.txt
[root@localhost ~]# ls -l ./dir/test.txt
-rw-rw-r--+ 1 root root 0 Jul 3 23:46 ./dir/test.txt
[root@localhost ~]# getfacl --omit-header ./dir/test.txt
user::rw-
user:john:rw-
group::rwx #effective:rw-
mask::rw-
other::r--
```
这里我们看到在dir下建立的文件john用户自动就有了read and write permission
**ACL相关命令**
前面的例子中我们都注意到了getfacl命令是用来读取文件的ACLsetfacl是用来设定文件的Acess ACL。这里还有一个chacl是用来改变文件和目录的Access ACL and Default ACL它的具体参数大家可以去看man page。我只想提及一下`chacl -B`。它可以彻底删除文件或者目录的ACL属性(包括Default ACL),比如你即使用了`setfacl -x`删除了所有文件的ACL属性那个+号还是会出现在文件的末尾,所以正确的删除方法应该是用`chacl -B`用cp来复制文件的时候我们现在可以加上`-p`选项。这样在拷贝文件的时候也将拷贝文件的ACL属性对于不能拷贝的ACL属性将给出警告。
mv命令将会默认地移动文件的ACL属性同样如果操作不允许的情况下会给出警告。
**需要注意的几点**
如果你的文件系统不支持ACL的话你也许需要重新mount你的file system
```
mount -o remount, acl [mount point]
```
如果用chmod命令改变Linux file permission的时候相应的ACL值也会改变反之改变ACL的值相应的file permission也会改变。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

51
command/strings.md Normal file
View File

@ -0,0 +1,51 @@
strings
===
在对象文件或二进制文件中查找可打印的字符串
## 补充说明
**strings命令** 在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列以换行符或空字符结束。 strings命令对识别随机对象文件很有用。
### 语法
```
strings [ -a ] [ - ] [ -o ] [ -t Format ] [ -n Number ] [ -Number ] [file ... ]
```
### 选项
```
-a --all扫描整个文件而不是只扫描目标文件初始化和装载段
-f print-file-name在显示字符串前先显示文件名
-n bytes=[number]找到并且输出所有NUL终止符序列
- 设置显示的最少的字符数默认是4个字符
-t --radix={o,d,x} :输出字符的位置,基于八进制,十进制或者十六进制
-o :类似--radix=o
-T --target= :指定二进制文件格式
-e --encoding={s,S,b,l,B,L} :选择字符大小和排列顺序:s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit
@ :读取中选项
```
### 实例
列出ls中所有的ASCII文本
```
strings /bin/ls
```
列出ls中所有的ASCII文本
```
cat /bin/ls strings
```
查找ls中包含libc的字符串不区分大小写
```
strings /bin/ls | grep -i libc
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

28
command/tac.md Normal file
View File

@ -0,0 +1,28 @@
tac
===
将文件已行为单位的反序输出
## 补充说明
**tac命令** 用于将文件已行为单位的反序输出,即第一行最后显示,最后一行先显示。
### 语法
```
tac(选项)(参数)
```
### 选项
```
-a或——append将内容追加到文件的末尾
-i或——ignore-interrupts忽略中断信号。
```
### 参数
文件列表:指定要保存内容的文件列表。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

47
command/tail.md Normal file
View File

@ -0,0 +1,47 @@
tail
===
在屏幕上显示指定文件的末尾若干行
## 补充说明
**tail命令** 用于输入文件中的尾部内容。tail命令默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为“-”,则读取标准输入。
注意如果表示字节或行数的N值之前有一个”+”号则从文件开头的第N项开始显示而不是显示文件的最后N项。N值后面可以有后缀b表示512k表示1024m表示1 048576(1M)。
### 语法
```
tail(选项)(参数)
```
### 选项
```
--retry即是在tail命令启动时文件不可访问或者文件稍后变得不可访问都始终尝试打开文件。使用此选项时需要与选项“——follow=name”连用
-c<N>或——bytes=<N>输出文件尾部的NN为整数个字节内容
-f<name/descriptor>或;--follow<nameldescript>显示文件最新追加的内容。“name”表示以文件名的方式监视文件的变化。“-f”与“-fdescriptor”等效
-F与选项“-follow=name”和“--retry"连用时功能相同;
-n<N>或——line=<N>输出文件的尾部NN位数字行内容。
--pid=<进程号>:与“-f”选项连用当指定的进程号的进程终止后自动退出tail命令
-q或——quiet或——silent当有多个文件参数时不输出各个文件名
-s<秒数>或——sleep-interal=<秒数>:与“-f”选项连用指定监视文件变化时间隔的秒数
-v或——verbose当有多个文件参数时总是输出各个文件名
--help显示指令的帮助信息
--version显示指令的版本信息。
```
### 参数
文件列表:指定要显示尾部内容的文件列表。
### 实例
```
tail file 显示文件file的最后10行
tail +20 file 显示文件file的内容从第20行至文件末尾
tail -c 10 file 显示文件file的最后10个字符
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

43
command/uncompress.md Normal file
View File

@ -0,0 +1,43 @@
uncompress
===
用来解压.Z文件
## 补充说明
**uncompress命令** 用来解压缩由compress命令压缩后产生的“.Z”压缩包。
### 语法
```
uncompress(选项)(参数)
```
### 选项
```
-f不提示用户强制覆盖掉目标文件
-c将结果送到标准输出无文件被改变
-r递归的操作方式。
```
### 参数
文件:指定要压缩的“.Z”压缩包。
### 实例
先创建一个.Z压缩文件
```
compress FileName
```
解压:
```
uncompress FileName.Z
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

29
command/unexpand.md Normal file
View File

@ -0,0 +1,29 @@
unexpand
===
将文件的空白字符转换为制表符
## 补充说明
**unexpand命令** 用于将给定文件中的空白字符space转换为制表符TAB并把转换结果显示在标准输出设备显示终端
### 语法
```
unexpand(选项)(参数)
```
### 选项
```
-a或--all转换文件中所有的空白字符
--first-only仅转换开头的空白字符
-t<N>指定TAB所代表的N个N为整数字符数默认N值是8。
```
### 参数
文件指定要转换空白为TAB的文件列表。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

28
command/unlink.md Normal file
View File

@ -0,0 +1,28 @@
unlink
===
系统调用函数unlink去删除指定的文件
## 补充说明
**unlink命令** 用于系统调用函数unlink去删除指定的文件。和rm命令作用一样都是删除文件。
### 语法
```
unlink(选项)(参数)
```
### 选项
```
--help显示帮助
--version显示版本号。
```
### 参数
文件:指定要删除的文件。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

35
command/updatedb.md Normal file
View File

@ -0,0 +1,35 @@
updatedb
===
创建或更新slocate命令所必需的数据库文件
## 补充说明
**updatedb命令** 用来创建或更新slocate命令所必需的数据库文件。updatedb命令的执行过程较长因为在执行时它会遍历整个系统的目录树并将所有的文件信息写入slocate数据库文件中。
补充说明slocate本身具有一个数据库里面存放了系统中文件与目录的相关信息。
### 语法
```
updatedb(选项)
```
### 选项
```
-o<文件>忽略默认的数据库文件使用指定的slocate数据库文件
-U<目录>更新指定目录的slocate数据库
-v显示执行的详细过程。
```
### 实例
实用updatedb命令的`-U`选项可以指定要更新slocate数据库的目录。
```
updatedb -U /usr/local/ 更新指定命令的slocate数据库
```
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

104
command/vi.md Normal file
View File

@ -0,0 +1,104 @@
vi
===
功能强大的纯文本编辑器
## 补充说明
**vi命令** 是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器。Linux中的vi编辑器叫vim它是vi的增强版vi Improved与vi编辑器完全兼容而且实现了很多增强功能。
vi编辑器支持编辑模式和命令模式编辑模式下可以完成文本的编辑功能命令模式下可以完成对文件的操作命令要正确使用vi编辑器就必须熟练掌握着两种模式的切换。默认情况下打开vi编辑器后自动进入命令模式。从编辑模式切换到命令模式使用“esc”键从命令模式切换到编辑模式使用“A”、“a”、“O”、“o”、“I”、“i”键。
vi编辑器提供了丰富的内置命令有些内置命令使用键盘组合键即可完成有些内置命令则需要以冒号“”开头输入。常用内置命令如下
```
Ctrl+u向文件首翻半屏
Ctrl+d向文件尾翻半屏
Ctrl+f向文件尾翻一屏
Ctrl+b向文件首翻一屏
Esc从编辑模式切换到命令模式
ZZ命令模式下保存当前文件所做的修改后退出vi
:行号:光标跳转到指定行的行首;
:$:光标跳转到最后一行的行首;
x或X删除一个字符x删除光标后的而X删除光标前的
D删除从当前光标到光标所在行尾的全部字符
dd删除光标行正行内容
ndd删除当前行及其后n-1行
nyy将当前行及其下n行的内容保存到寄存器其中为一个字母n为一个数字
p粘贴文本操作用于将缓存区的内容粘贴到当前光标所在位置的下方
P粘贴文本操作用于将缓存区的内容粘贴到当前光标所在位置的上方
/字符串:文本查找操作,用于从当前光标所在位置开始向文件尾部查找指定字符串的内容,查找的字符串会被加亮显示;
name文本查找操作用于从当前光标所在位置开始向文件头部查找指定字符串的内容查找的字符串会被加亮显示
abs/F/T替换文本操作用于在第a行到第b行之间将F字符串换成T字符串。其中“s/”表示进行替换操作;
a在当前字符后添加文本
A在行末添加文本
i在当前字符前插入文本
I在行首插入文本
o在当前行后面插入一空行
O在当前行前面插入一空行
:wq在命令模式下执行存盘退出操作
:w在命令模式下执行存盘操作
:w在命令模式下执行强制存盘操作
:q在命令模式下执行退出vi操作
:q在命令模式下执行强制退出vi操作
:e文件名在命令模式下打开并编辑指定名称的文件
:n在命令模式下如果同时打开多个文件则继续编辑下一个文件
:f在命令模式下用于显示当前的文件名、光标所在行的行号以及显示比例
:set number在命令模式下用于在最左端显示行号
:set nonumber在命令模式下用于在最左端不显示行号
```
### 语法
```
vi(选项)(参数)
```
### 选项
```
+<行号>:从指定行号的行开始先是文本内容;
-b以二进制模式打开文件用于编辑二进制文件和可执行文件
-c<指令>:在完成对第一个文件编辑任务后,执行给出的指令;
-d以diff模式打开文件当多个文件编辑时显示文件差异部分
-l使用lisp模式打开“lisp”和“showmatch”
-m取消写文件功能重设“write”选项
-M关闭修改功能
-n不实用缓存功能
-o<文件数目>:指定同时打开指定数目的文件;
-R以只读方式打开文件
-s安静模式不现实指令的任何错误信息。
```
### 参数
文件列表:指定要编辑的文件列表。多个文件之间使用空格分隔开。
## 知识扩展
vi编辑器有三种工作方式命令方式、输入方式和ex转义方式。通过相应的命令或操作在这三种工作方式之间可以进行转换。
**命令方式**
在Shell提示符后输入命令vi进入vi编辑器并处于vi的命令方式。此时从键盘上输入的任何字符都被作为编辑命令来解释例如a(append表示附加命令i(insert表示插入命令x表示删除字符命令等。如果输入的字符不是vi的合法命令则机器发出“报警声”光标不移动。另外在命令方式下输入的字符即vi命令并不在屏幕上显示出来例如输入i屏幕上并无变化但通过执行i命令编辑器的工作方式却发生变化由命令方式变为输入方式。
**输入方式**
通过输入vi的插入命令i、附加命令a、打开命令o、替换命令s、修改命令(c或取代命令r可以从命令方式进入输入方式。在输入方式下从键盘上输入的所有字符都被插入到正在编辑的缓冲区中被当做该文件的正文。进入输入方式后输入的可见字符都在屏幕上显示出来而编辑命令不再起作用仅作为普通字母出现。例如在命令方式下输入字母i进到输入方式然后再输入i就在屏幕上相应光标处添加一个字母i。
由输入方式回到命令方式的办法是按下Esc键。如果已在命令方式下那么按下Esc键就会发出“嘟嘟”声。为了确保用户想执行的vi命令是在命令方式下输入的不妨多按几下Esc键听到嘟声后再输入命令。
**ex转义方式**
vi和ex编辑器的功能是相同的二者的主要区别是用户界面。在vi中命令通常是单个字母如a,x,r等。而在ex中命令是以Enter键结束的命令行。vi有一个专门的“转义”命令可访问很多面向行的ex命令。为使用ex转义方式可输入一个冒号:。作为ex命令提示符冒号出现在状态行通常在屏幕最下一行。按下中断键通常是Del键可终止正在执行的命令。多数文件管理命令都是在ex转义方式下执行的例如读取文件把编辑缓冲区的内容写到文件中等。转义命令执行后自动回到命令方式。例如
```
:1,$s/I/i/g 按Enter键
```
则从文件第一行至文件末尾($将大写I全部替换成小写i。vi编辑器的三种工作方式之间的转换如图所示。
!vi
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

37
command/zcat.md Normal file
View File

@ -0,0 +1,37 @@
zcat
===
显示压缩包中文件的内容
## 补充说明
**zcat命令** 用于不真正解压缩文件,就能显示压缩包中文件的内容的场合。
### 语法
```
zcat(选项)(参数)
```
### 选项
```
-S指定gzip格式的压缩包的后缀。当后缀不是标准压缩包后缀时使用此选项
-c将文件内容写到标注输出
-d执行解压缩操作
-l显示压缩包中文件的列表
-L显示软件许可信息
-q禁用警告信息
-r在目录上执行递归操作
-t测试压缩文件的完整性
-V显示指令的版本信息
-l更快的压缩速度
-9更高的压缩比。
```
### 参数
文件:指定要显示其中文件内容的压缩包。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

21
command/zfore.md Normal file
View File

@ -0,0 +1,21 @@
zfore
===
强制为gzip格式的压缩文件添加.gz后缀
## 补充说明
**zfore命令** 强制为gzip格式的压缩文件添加“.gz”后缀。
### 语法
```
zfore(参数)
```
### 参数
文件列表:指定要添加“.gz”后缀的gzip压缩文件。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

29
command/zipsplit.md Normal file
View File

@ -0,0 +1,29 @@
zipsplit
===
将较大的zip压缩包分割成各个较小的压缩包
## 补充说明
**zipsplit命令** 用于将较大的“zip”压缩包分割成各个较小的“zip”压缩包。
### 语法
```
zipsplit(选项)(参数)
```
### 选项
```
-n指定分割后每个zip文件的大小
-t报告将要产生的较小的zip文件的大小
-b指定分割后的zip文件的存放位置。
```
### 参数
文件指定要分割的zip压缩包。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->

32
command/znew.md Normal file
View File

@ -0,0 +1,32 @@
znew
===
将.Z压缩包重新转化为gzip命令压缩的.gz压缩包
## 补充说明
**znew命令** 用于将使用compress命令压缩的“.Z”压缩包重新转化为使用gzip命令压缩的“.gz”压缩包。
### 语法
```
znew(选项)(参数)
```
### 选项
```
-f强制执行转换操作即是目标“.gz”已经存在
-t删除原文件前测试新文件
-v显示文件名和每个文件的压缩比
-9食用油花的压缩比速度较慢
-P使用管道完成转换操作以降低磁盘空间使用
-K当“.Z”文件比“.gz”文件小时保留“.Z”文件。
```
### 参数
文件指定compress指令压缩生成的“.Z”压缩包。
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->