📝 Writing docs.

This commit is contained in:
Zhang Peng 2018-09-27 14:32:58 +08:00
parent eddd516903
commit f3e89e79c5
18 changed files with 835 additions and 3854 deletions

View File

@ -7,15 +7,14 @@
- [samba 使用详解](软件/samba使用详解.md)
- [linux 常用命令](commands/README.md)
- [命令行的艺术(转载)](commands/命令行的艺术.md)
- [Linux 帮助命令](commands/Linux帮助命令.md) - 关键词:`help`, `whatis`, `info`, `man`, `which`, `whereis`
- [linux 常用命令-文件目录管理](commands/文件目录管理/README.md)
- [linux 常用命令-文件内容查看](commands/文件目录管理/文件内容查看.md)
- [linux 常用命令-文件压缩与解压](commands/文件目录管理/文件压缩与解压.md)
- [linux 常用命令-文件处理](commands/文件目录管理/文件处理.md)
- [linux 常用命令-文件编辑](commands/文件目录管理/文件编辑.md)
- [linux 常用命令-文件权限属性设置](commands/文件目录管理/文件权限属性设置.md)
- [linux 常用命令-文件查找和比较](commands/文件目录管理/文件查找和比较.md)
- [linux 常用命令-目录基本操作](commands/文件目录管理/目录基本操作.md)
- [Linux 帮助命令](commands/Linux帮助命令.md) - 关键词:`help`, `whatis`, `info`, `man`
- [Linux 文件内容查看命令](commands/Linux文件内容查看命令.md) - 关键词:`cat`, `head`, `tail`, `more`, `less`
- [Linux 文件处理命令](commands/Linux文件处理命令.md) - 关键词:`touch`, `ln`, `rename`
- [Linux 文件编辑命令](commands/Linux文件编辑命令.md) - 关键词:`sed`, `vi`
- [Linux 文件权限管理命令](commands/Linux文件权限管理命令.md) - 关键词:`chmod`, `chown`, `stat`, `file`
- [Linux 文件查找和比较命令](commands/Linux文件查找和比较命令.md) - 关键词:`diff`, `locate`/`slocate`, `find`, `which`, `whereis`
- [Linux 文件目录管理命令](commands/Linux文件目录管理命令.md) - 关键词:`cd`, `ls`, `pwd`, `mkdir`, `rmdir`, `tree`, `cp`, `mv`, `rm`
- [Linux 文件压缩与解压命令](commands/Linux文件压缩与解压命令.md) - 关键词:`tar`, `gzip`, `zip`, `unzip`
- [Linux 用户管理命令](commands/Linux用户管理命令.md) - 关键词:`groupadd`, `groupdel`, `groupmod`, `useradd`, `userdel`, `usermod`, `passwd`, `su`, `sudo`
- [Linux 系统管理命令](commands/Linux系统管理命令.md) - 关键词:`reboot`, `exit`, `shutdown`, `date`, `mount`, `umount`
- [Linux 性能管理命令](commands/Linux性能管理命令.md) - 关键词:`df`, `du`, `top`, `free`, `iotop`

View File

@ -10,7 +10,7 @@ tags:
# Linux 帮助命令
> 关键词:`help`, `whatis`, `info`, `man`, `which`, `whereis`
> 关键词:`help`, `whatis`, `info`, `man`
<!-- TOC depthFrom:2 depthTo:2 -->
@ -18,8 +18,6 @@ tags:
- [whatis](#whatis)
- [info](#info)
- [man](#man)
- [which](#which)
- [whereis](#whereis)
<!-- /TOC -->
@ -46,29 +44,3 @@ tags:
> man 命令是 Linux 下的帮助指令,通过 man 指令可以查看 Linux 中的指令帮助、配置文件帮助和编程帮助等信息。
>
> 参考http://man.linuxde.net/man
## which
> which 命令用于查找并显示给定命令的绝对路径,环境变量 PATH 中保存了查找命令时需要遍历的目录。
>
> 参考http://man.linuxde.net/which
示例:
```sh
# which pwd
/bin/pwd
```
## whereis
> whereis 命令用来定位指令的二进制程序、源代码文件和 man 手册页等相关文件的路径。
>
> 参考http://man.linuxde.net/whereis
示例:
```sh
# whereis git
git: /usr/bin/git /usr/share/man/man1/git.1.gz
```

View File

@ -0,0 +1,92 @@
---
title: Linux 文件内容查看命令
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
# Linux 文件内容查看命令
> 关键词:`cat`, `head`, `tail`, `more`, `less`
<!-- TOC depthFrom:2 depthTo:2 -->
- [连接文件并打印到标准输出设备 - cat](#连接文件并打印到标准输出设备---cat)
- [显示指定文件的开头若干行 - head](#显示指定文件的开头若干行---head)
- [显示指定文件的末尾若干行 - tail](#显示指定文件的末尾若干行---tail)
- [显示文件内容,每次显示一屏 - more](#显示文件内容每次显示一屏---more)
- [显示文件内容,每次显示一屏 - less](#显示文件内容每次显示一屏---less)
<!-- /TOC -->
## 连接文件并打印到标准输出设备 - cat
> cat 命令用于连接文件并打印到标准输出设备上。
>
> 参考http://man.linuxde.net/cat
示例:
```sh
cat m1 # 在屏幕上显示文件 ml 的内容
cat m1 m2 # 同时显示文件 ml 和 m2 的内容
cat m1 m2 > file # 将文件 ml 和 m2 合并后放入文件 file 中
```
## 显示指定文件的开头若干行 - head
> head 命令用于显示文件的开头内容。在默认情况下head 命令显示文件的头部 10 行内容。
>
> 参考http://man.linuxde.net/head
## 显示指定文件的末尾若干行 - tail
> tail 命令用于显示文件的尾部内容。在默认情况下tail 命令显示文件的尾部 10 行内容。如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为“-”,则读取标准输入。
>
> 参考http://man.linuxde.net/tail
示例:
```sh
tail file # 显示文件file的最后10行
tail -n +20 file # 显示文件file的内容从第20行至文件末尾
tail -c 10 file # 显示文件file的最后10个字符
```
## 显示文件内容,每次显示一屏 - more
> more 命令是一个基于 vi 编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持 vi 中的关键字定位操作。more 名单中内置了若干快捷键,常用的有 H获得帮助信息Enter向下翻滚一行空格向下滚动一屏Q退出命令
>
> 该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比:--More--XX%)可以用下列不同的方法对提示做出回答:
>
> - 按 Space 键:显示文本的下一屏内容。
> - 按 Enier 键:只显示文本的下一行内容。
> - 按斜线符|:接着输入一个模式,可以在文本中寻找下一个相匹配的模式。
> - 按 H 键:显示帮助屏,该屏上有相关的帮助信息。
> - 按 B 键:显示上一屏内容。
> - 按 Q 键:退出 rnore 命令。
>
> 参考http://man.linuxde.net/more
示例:
```sh
# 显示文件 file 的内容,但在显示之前先清屏,并且在屏幕的最下方显示完核的百分比。
more -dc file
# 显示文件 file 的内容,每 10 行显示一次,而且在显示之前先清屏。
more -c -10 file
```
## 显示文件内容,每次显示一屏 - less
less 命令的作用与 more 十分相似,都可以用来浏览文字档案的内容,不同的是 less 命令允许用户向前或向后浏览文件,而 more 命令只能向前浏览。用 less 命令显示文件时,用 PageUp 键向上翻页,用 PageDown 键向下翻页。要退出 less 程序,应按 Q 键。
示例:
```sh
less /var/log/shadowsocks.log
```

View File

@ -0,0 +1,87 @@
---
title: Linux 文件压缩与解压命令
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
# Linux 文件压缩与解压命令
> 关键词:`tar`, `gzip`, `zip`, `unzip`
<!-- TOC depthFrom:2 depthTo:2 -->
- [压缩和解压 tar 文件 - tar](#压缩和解压-tar-文件---tar)
- [压缩和解压 gz 文件 - gzip](#压缩和解压-gz-文件---gzip)
- [压缩 zip 文件 - zip](#压缩-zip-文件---zip)
- [解压 zip 文件 - unzip](#解压-zip-文件---unzip)
<!-- /TOC -->
## 压缩和解压 tar 文件 - tar
> tar 命令可以为 linux 的文件和目录创建档案。利用 tar可以为某一特定文件创建档案备份文件也可以在档案中改变文件或者向档案中加入新的文件。tar 最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用 tar 命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。
>
> 参考http://man.linuxde.net/tar
示例:
```sh
tar -cvf log.tar log2012.log # 仅打包,不压缩
tar -zcvf log.tar.gz log2012.log # 打包后,以 gzip 压缩
tar -jcvf log.tar.bz2 log2012.log # 打包后,以 bzip2 压缩
tar -ztvf log.tar.gz # 查阅上述 tar 包内有哪些文件
tar -zxvf log.tar.gz # 将 tar 包解压缩
tar -zxvf log30.tar.gz log2013.log # 只将 tar 内的部分文件解压出来
```
## 压缩和解压 gz 文件 - gzip
> gzip 命令用来压缩文件。gzip 是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多出“.gz”扩展名。
>
> gzip 是在 Linux 系统中经常使用的一个对文件进行压缩和解压缩的命令既方便又好用。gzip 不仅可以用来压缩大的、较少使用的文件以节省磁盘空间,还可以和 tar 命令一起构成 Linux 操作系统中比较流行的压缩文件格式。据统计gzip 命令对文本文件有 60% 70%的压缩率。减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。
>
> 参考http://man.linuxde.net/gzip
示例:
```sh
gzip * # 将所有文件压缩成 .gz 文件
gzip -l * # 详细显示压缩文件的信息,并不解压
gzip -dv * # 解压上例中的所有压缩文件,并列出详细的信息
gzip -r log.tar # 压缩一个 tar 备份文件,此时压缩文件的扩展名为.tar.gz
gzip -rv test/ # 递归的压缩目录
gzip -dr test/ # 递归地解压目录
```
## 压缩 zip 文件 - zip
> zip 命令可以用来解压缩文件或者对文件进行打包操作。zip 是个使用广泛的压缩程序,文件经它压缩后会另外产生具有“.zip”扩展名的压缩文件。
>
> 参考http://man.linuxde.net/zip
示例:
```sh
# 将 /home/Blinux/html/ 这个目录下所有文件和文件夹打包为当前目录下的 html.zip
zip -q -r html.zip /home/Blinux/html
```
## 解压 zip 文件 - unzip
> unzip 命令用于解压缩由 zip 命令压缩的“.zip”压缩包。
>
> 参考http://man.linuxde.net/unzip
示例:
```sh
unzip test.zip # 解压 zip 文件
unzip -n test.zip -d /tmp/ # 在指定目录下解压缩
unzip -o test.zip -d /tmp/ # 在指定目录下解压缩,如果有相同文件存在则覆盖
unzip -v test.zip # 查看压缩文件目录,但不解压
```

View File

@ -0,0 +1,71 @@
---
title: Linux 文件处理命令
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
# Linux 文件处理命令
> 关键词:`touch`, `ln`, `rename`
<!-- TOC depthFrom:2 depthTo:2 -->
- [创建空文件 - touch](#创建空文件---touch)
- [为文件创建连接 - ln](#为文件创建连接---ln)
- [批量重命名 - rename](#批量重命名---rename)
<!-- /TOC -->
## 创建空文件 - touch
> touch 命令有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;二是用来创建空文件。
>
> 参考http://man.linuxde.net/touch
示例:
```
touch ex2
```
## 为文件创建连接 - ln
> ln 命令用来为文件创建连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用"-s"选项。
>
> 注意:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的。
>
> 参考http://man.linuxde.net/ln
示例:
```sh
# 将目录 /usr/mengqc/mub1 下的文件 m2.c 链接到目录 /usr/liu 下的文件 a2.c
cd /usr/mengqc
ln /mub1/m2.c /usr/liu/a2.c
# 在目录 /usr/liu 下建立一个符号链接文件 abc使它指向目录 /usr/mengqc/mub1
# 执行该命令后,/usr/mengqc/mub1 代表的路径将存放在名为 /usr/liu/abc 的文件中
ln -s /usr/mengqc/mub1 /usr/liu/abc
```
## 批量重命名 - rename
> rename 命令用字符串替换的方式批量重命名。
>
> 参考http://man.linuxde.net/rename
示例:
```sh
# 将 main1.c 重命名为 main.c
rename main1.c main.c main1.c
rename "s/AA/aa/" * # 把文件名中的 AA 替换成 aa
rename "s//.html//.php/" * # 把 .html 后缀的改成 .php 后缀
rename "s/$//.txt/" * # 把所有的文件名都以 txt 结尾
rename "s//.txt//" * # 把所有以 .txt 结尾的文件名的.txt 删掉
```

View File

@ -0,0 +1,103 @@
---
title: Linux 文件权限管理命令
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
# Linux 文件权限管理命令
> 关键词:`chmod`, `chown`, `stat`, `file`
<!-- TOC depthFrom:2 depthTo:2 -->
- [设置文件或目录的权限 - chmod](#设置文件或目录的权限---chmod)
- [设置文件或目录的拥有者或所属群组 - chown](#设置文件或目录的拥有者或所属群组---chown)
- [显示文件的详细信息 - stat](#显示文件的详细信息---stat)
- [显示文件类型 - file](#显示文件类型---file)
<!-- /TOC -->
## 设置文件或目录的权限 - chmod
> chmod 命令用来变更文件或目录的权限。在 UNIX 系统家族里,文件或目录权限的控制分别以读取、写入、执行 3 种一般权限来区分,另有 3 种特殊权限可供运用。用户可以使用 chmod 指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。
>
> 参考http://man.linuxde.net/chmod
知识扩展:
Linux 用 户分为:拥有者、组群(Group)、其他otherLinux 系统中,预设的情況下,系统中所有的帐号与一般身份使用者,以及 root 的相关信 息, 都是记录在`/etc/passwd`文件中。每个人的密码则是记录在`/etc/shadow`文件下。 此外,所有的组群名称记录在`/etc/group`內!
linux 文件的用户权限的分析图
```bash
-rw-r--r-- 1 user staff 651 Oct 12 12:53 .gitmodules
# ↑╰┬╯╰┬╯╰┬╯
# ┆ ┆ ┆ ╰┈ 0 其他人
# ┆ ┆ ╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ g 属组
# ┆ ╰┈┈┈┈ u 属组
# ╰┈┈ 第一个字母 `d` 代表目录,`-` 代表普通文件
```
rwx   rw-  r--
r=读取属性  //值= 4
w=写入属性  //值= 2
x=执行属性  //值= 1
示例:
```sh
chmod u+x,g+w f01  # 为文件f01设置自己可以执行组员可以写入的权限
chmod u=rwx,g=rw,o=r f01
chmod 764 f01
chmod a+x f01   # 对文件f01的u,g,o都设置可执行属性
# 将/home/wwwroot/里的所有文件和文件夹设置为755权限
chmod -R 755 /home/wwwroot/*
```
## 设置文件或目录的拥有者或所属群组 - chown
> chown 命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户 D用户组可以是组名或组 id。文件名可以使由空格分开的文件列表在文件名中可以包含通配符。
>
> 只有文件拥有者和超级用户才可以便用该命令。
>
> 参考http://man.linuxde.net/chown
示例:
```sh
# 将目录/usr/meng及其下面的所有文件、子目录的文件主改成 liu
chown -R liu /usr/meng
```
## 显示文件的详细信息 - stat
> stat 命令用于显示文件的状态信息。stat 命令的输出信息比 ls 命令的输出信息要更详细。
>
> 参考http://man.linuxde.net/stat
示例:
```sh
stat myfile
```
## 显示文件类型 - file
> file 命令用来探测给定文件的类型。file 命令对文件的检查分为文件系统、魔法幻数检查和语言检查 3 个过程。
>
> 参考http://man.linuxde.net/file
示例:
```sh
file install.log # 显示文件类型
file -b install.log # 不显示文件名称
file -i install.log # 显示 MIME 类型
file -L /var/spool/mail # 显示符号链接的文件类型
```

View File

@ -0,0 +1,118 @@
---
title: Linux 文件查找和比较命令
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
# Linux 文件查找和比较命令
> 关键词:`diff`, `locate`/`slocate`, `find`, `which`, `whereis`
<!-- TOC depthFrom:2 depthTo:2 -->
- [比较文件 - diff](#比较文件---diff)
- [查找文件或目录 - locate/slocate](#查找文件或目录---locateslocate)
- [在指定目录下查找文件 - find](#在指定目录下查找文件---find)
- [查找命令的绝对路径 - which](#查找命令的绝对路径---which)
- [查找命令的程序、源代码等相关文件 - whereis](#查找命令的程序源代码等相关文件---whereis)
<!-- /TOC -->
## 比较文件 - diff
> diff 命令在最简单的情况下,比较给定的两个文件的不同。如果使用“-”代替“文件”参数则要比较的内容将来自标准输入。diff 命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。
>
> 参考http://man.linuxde.net/diff
示例:
```sh
diff /usr/li test.txt # 比较文件
```
## 查找文件或目录 - locate/slocate
> locate 命令和 slocate 命令都用来查找文件或目录。
>
> locate 命令其实是 find -name 的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb这个数据库中含有本地所有文件信息。Linux 系统自动创建这个数据库,并且每天自动更新一次,所以使用 locate 命令查不到最新变动过的文件。为了避免这种情况,可以在使用 locate 之前,先使用 updatedb 命令,手动更新数据库。
>
> 参考http://man.linuxde.net/locate_slocate
示例:
```sh
locate pwd # 查找和 pwd 相关的所有文件
locate /etc/sh # 搜索 etc 目录下所有以 sh 开头的文件
```
## 在指定目录下查找文件 - find
> find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
>
> 参考http://man.linuxde.net/find
```sh
# 当前目录搜索所有文件,文件内容 包含 “140.206.111.111” 的内容
find . -type f -name "*" | xargs grep "140.206.111.111"
# 列出当前目录及子目录下所有文件和文件夹
find .
# 在 /home 目录下查找以 .txt 结尾的文件名
find /home -name "*.txt"
# 同上,但忽略大小写
find /home -iname "*.txt"
# 当前目录及子目录下查找所有以 .txt 和 .pdf 结尾的文件
find . -name "*.txt" -o -name "*.pdf"
# 匹配文件路径或者文件
find /usr/ -path "*local*"
# 基于正则表达式匹配文件路径
find . -regex ".*\(\.txt\|\.pdf\)$"
# 同上,但忽略大小写
find . -iregex ".*\(\.txt\|\.pdf\)$"
# 找出 /home 下不是以 .txt 结尾的文件
find /home ! -name "*.txt"
```
## 查找命令的绝对路径 - which
> which 命令用于查找并显示给定命令的绝对路径,环境变量 PATH 中保存了查找命令时需要遍历的目录。which 指令会在环境变量$PATH 设置的目录里查找符合条件的文件。也就是说,使用 which 命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
>
> 参考http://man.linuxde.net/which
示例:
```sh
which pwd # 查找命令的路径
```
说明which 是根据使用者所配置的  PATH 变量内的目录去搜寻可运行档的!所以,不同的  PATH 配置内容所找到的命令当然不一样的!
```sh
[root@localhost ~]# which cd
cd: shell built-in command
```
cd 这个常用的命令竟然找不到啊!为什么呢?这是因为 cd 是 bash 内建的命令! 但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的!
## 查找命令的程序、源代码等相关文件 - whereis
> whereis 命令用来定位指令的二进制程序、源代码文件和 man 手册页等相关文件的路径。
>
> whereis 命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b、man 说明文件(参数-m和源代码文件参数-s。如果省略参数则返回所有信息。
>
> 参考http://man.linuxde.net/whereis
示例:
```sh
whereis git # 将相关的文件都查找出来
```

View File

@ -1,6 +0,0 @@
# Linux 文件目录管理
<!-- TOC depthFrom:2 depthTo:2 -->
<!-- /TOC -->

View File

@ -0,0 +1,193 @@
---
title: Linux 文件目录管理命令
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
# Linux 文件目录管理命令
> 关键词:`cd`, `ls`, `pwd`, `mkdir`, `rmdir`, `tree`, `cp`, `mv`, `rm`
<!-- TOC depthFrom:2 depthTo:2 -->
- [切换目录 - cd](#切换目录---cd)
- [显示目录信息 - ls](#显示目录信息---ls)
- [显示当前目录的绝对路径 - pwd](#显示当前目录的绝对路径---pwd)
- [创建目录 - mkdir](#创建目录---mkdir)
- [删除空目录 - rmdir](#删除空目录---rmdir)
- [树状显示目录的内容 - tree](#树状显示目录的内容---tree)
- [复制文件或目录 - cp](#复制文件或目录---cp)
- [移动文件或目录 - mv](#移动文件或目录---mv)
- [删除文件或目录 - rm](#删除文件或目录---rm)
<!-- /TOC -->
## 切换目录 - cd
> cd 命令用来切换工作目录。
>
> 参考http://man.linuxde.net/cd
示例:
```sh
cd # 切换到用户主目录
cd ~ # 切换到用户主目录
cd - # 切换到上一个工作目录
cd .. # 切换到上级目录
cd ../.. # 切换到上两级目录
```
## 显示目录信息 - ls
> ls 命令用来显示目录信息。
>
> 参考http://man.linuxde.net/ls
示例:
```sh
ls # 列出当前目录可见文件
ls -l # 列出当前目录可见文件详细信息
ls -la # 列出所有文件(包括隐藏)的详细信息
ls -lh # 列出详细信息并以可读大小显示文件大小
ls -lt # 按时间列出文件和文件夹详细信息
ls -ltr # 按修改时间列出文件和文件夹详细信息
ls --color=auto # 列出文件并标记颜色分类
```
## 显示当前目录的绝对路径 - pwd
> pwd 命令用来显示当前目录的绝对路径。
>
> 参考http://man.linuxde.net/pwd
## 创建目录 - mkdir
> mkdir 命令用来创建目录。
>
> 参考http://man.linuxde.net/mkdir
示例:
```sh
# 在当前目录中创建 zp 和 zp 的子目录 test
mkdir -p zp/test
# 在当前目录中创建 zp 和 zp 的子目录 test权限设置为文件主可读、写、执行同组用户可读和执行其他用户无权访问
mkdir -p -m 750 zp/test
```
## 删除空目录 - rmdir
> rmdir 命令用来删除空目录。
>
> 参考http://man.linuxde.net/rmdir
示例:
```sh
# 删除子目录 test 和其父目录 zp
rmdir -p zp/test
```
## 树状显示目录的内容 - tree
> tree 命令以树状显示目录的内。
>
> 参考http://man.linuxde.net/tree
示例:
```sh
# 列出目录 /private 第一级文件名
tree /private -L 1
/private/
├── etc
├── tftpboot
├── tmp
└── var
# 忽略文件夹
tree -I node_modules # 忽略当前目录文件夹 node_modules
tree -P node_modules # 列出当前目录文件夹 node_modules 的目录结构
tree -P node_modules -L 2 # 显示目录 node_modules 两层的目录树结构
tree -L 2 > /home/www/tree.txt # 当前目录结果存到 tree.txt 文件中
# 忽略多个文件夹
tree -I 'node_modules|icon|font' -L 2
```
## 复制文件或目录 - cp
> cp 命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp 命令还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误。
>
> 参考http://man.linuxde.net/cp
示例:
### 参数
- 源文件制定源文件列表。默认情况下cp 命令不能复制目录,如果要复制目录,则必须使用`-R`选项;
- 目标文件:指定目标文件。当“源文件”为多个文件时,要求“目标文件”为指定的目录。
示例:
```sh
# 将文件 file 复制到目录 /usr/men/tmp 下,并改名为 file1
cp file /usr/men/tmp/file1
# 将目录 /usr/men下的所有文件及其子目录复制到目录 /usr/zh 中
cp -r /usr/men /usr/zh
# 强行将 /usr/men下的所有文件复制到目录 /usr/zh 中,无论是否有文件重复
cp -rf /usr/men/* /usr/zh
# 将目录 /usr/men 中的以 m 打头的所有 .c 文件复制到目录 /usr/zh 中
cp -i /usr/men m*.c /usr/zh
```
## 移动文件或目录 - mv
> mv 命令用来对文件或目录重新命名或者将文件从一个目录移到另一个目录中。source 表示源文件或目录target 表示目标文件或目录。如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆盖。
>
> 参考http://man.linuxde.net/mv
示例:
```sh
mv file1.txt /home/office/ # 移动单个文件
mv file2.txt file3.txt file4.txt /home/office/ # 移动多个文件
mv *.txt /home/office/ # 移动所有 txt 文件
mv dir1/ /home/office/ # 移动目录
mv /usr/men/* . # 将指定目录中的所有文件移到当前目录中
mv file1.txt file2.txt # 重命名文件
mv dir1/ dir2/ # 重命名目录
mv -v *.txt /home/office # 打印移动信息
mv -i file1.txt /home/office # 提示是否覆盖文件
mv -uv *.txt /home/office # 源文件比目标文件新时才执行更新
mv -vn *.txt /home/office # 不要覆盖任何已存在的文件
mv -f *.txt /home/office # 无条件覆盖已经存在的文件
mv -bv *.txt /home/office # 复制时创建备份
```
## 删除文件或目录 - rm
> rm 命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉。对于链接文件,只是删除整个链接文件,而原有文件保持不变。
>
> 参考http://man.linuxde.net/rm
```sh
rm test.txt # 删除文件
rm -i test.txt test2.txt # 交互式删除文件
rm -r * # 删除当前目录下的所有文件和目录
rm -r testdir # 删除目录下的所有文件和目录
rm -rf testdir # 强制删除目录下的所有文件和目录
rm -v testdir # 显示当前删除操作的详情
```

View File

@ -0,0 +1,162 @@
---
title: Linux 文件编辑命令
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
<!-- TOC depthFrom:2 depthTo:2 -->
- [流编辑器 - sed](#流编辑器---sed)
- [文本编辑器 - vi](#文本编辑器---vi)
<!-- /TOC -->
# Linux 文件编辑命令
## 流编辑器 - sed
> sed 是一种流编辑器它是文本处理工具能够完美的配合正则表达式使用功能不同凡响。处理时把当前处理的行存储在临时缓冲区中称为“模式空间”pattern space接着用 sed 命令处理缓冲区中的内容处理完成后把缓冲区的内容送往屏幕。接着处理下一行这样不断重复直到文件末尾。文件内容并没有改变除非你使用重定向存储输出。Sed 主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
>
> 参考http://man.linuxde.net/sed
示例:
```sh
# 替换文本中的字符串
sed 's/book/books/' file
# -n 选项 和 p 命令 一起使用表示只打印那些发生替换的行
sed -n 's/test/TEST/p' file
# 直接编辑文件选项 -i ,会匹配 file 文件中每一行的第一个 book 替换为 books
sed -i 's/book/books/g' file
# 使用后缀 /g 标记会替换每一行中的所有匹配
sed 's/book/books/g' file
# 删除空白行
sed '/^$/d' file
# 删除文件的第2行
sed '2d' file
# 删除文件的第2行到末尾所有行
sed '2,$d' file
# 删除文件最后一行
sed '$d' file
# 删除文件中所有开头是test的行
sed '/^test/'d file
```
## 文本编辑器 - vi
> vi 命令是 UNIX 操作系统和类 UNIX 操作系统中最通用的全屏幕纯文本编辑器。Linux 中的 vi 编辑器叫 vim它是 vi 的增强版vi Improved与 vi 编辑器完全兼容,而且实现了很多增强功能。
>
> 参考http://man.linuxde.net/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.jpg](http://man.linuxde.net/wp-content/uploads/2013/11/vi.jpg)
```
```

View File

@ -1,9 +0,0 @@
# linux 常用命令-文件目录管理
* [linux 常用命令-文件内容查看](文件内容查看.md)
* [linux 常用命令-文件压缩与解压](文件压缩与解压.md)
* [linux 常用命令-文件处理](文件处理.md)
* [linux 常用命令-文件编辑](文件编辑.md)
* [linux 常用命令-文件权限属性设置](文件权限属性设置.md)
* [linux 常用命令-文件查找和比较](文件查找和比较.md)
* [linux 常用命令-目录基本操作](目录基本操作.md)

View File

@ -1,366 +0,0 @@
---
title: linux 常用命令-文件内容查看
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
<!-- TOC -->
- [linux 常用命令-文件内容查看](#linux-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4-%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9%E6%9F%A5%E7%9C%8B)
- [cut](#cut)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [指定字段的字符或者字节范围](#%E6%8C%87%E5%AE%9A%E5%AD%97%E6%AE%B5%E7%9A%84%E5%AD%97%E7%AC%A6%E6%88%96%E8%80%85%E5%AD%97%E8%8A%82%E8%8C%83%E5%9B%B4)
- [head](#head)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [tail](#tail)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [more](#more)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [less](#less)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
<!-- /TOC -->
# linux 常用命令-文件内容查看
## cut
连接文件并打印到标准输出设备上
### 补充说明
**cut命令** 用来显示行中的指定部分删除文件中指定字段。cut经常用来显示文件的内容类似于下的type命令。
说明该命令有两项功能其一是用来显示文件的内容它依次读取由参数file所指 明的文件,将它们的内容输出到标准输出上;其二是连接两个或多个文件,如`cut fl f2 > f3`将把文件fl和几的内容合并起来然后通过输出重定向符“>”的作用将它们放入文件f3中。
当文件较大时文本在屏幕上迅速闪过滚屏用户往往看不清所显示的内容。因此一般用more等命令分屏显示。为了控制滚屏可以按Ctrl+S键停止滚屏按Ctrl+Q键可以恢复滚屏。按Ctrl+C中断键可以终止该命令的执行并且返回Shell提示符状态。
### 语法
```
cut(选项)(参数)
```
### 选项
```
-b仅显示行中指定直接范围的内容
-c仅显示行中指定范围的字符
-d指定字段的分隔符默认的字段分隔符为“TAB”
-f显示指定字段的内容
-n与“-b”选项连用不分割多字节字符
--complement补足被选择的字节、字符或字段
--out-delimiter=<字段分隔符>:指定输出内容是的字段分割符;
--help显示指令的帮助信息
--version显示指令的版本信息。
```
### 参数
文件:指定要进行内容过滤的文件。
### 实例
例如有一个学生报表信息包含No、Name、Mark、Percent
```
[root@localhost text]# cat test.txt
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98
```
使用 **-f** 选项提取指定字段:
```
[root@localhost text]# cut -f 1 test.txt
No
01
02
03
```
```
[root@localhost text]# cut -f2,3 test.txt
Name Mark
tom 69
jack 71
alex 68
```
**--complement** 选项提取指定字段之外的列(打印除了第二列之外的列):
```
[root@localhost text]# cut -f2 --complement test.txt
No Mark Percent
01 69 91
02 71 87
03 68 98
```
使用 **-d** 选项指定字段分隔符:
```
[root@localhost text]# cat test2.txt
No;Name;Mark;Percent
01;tom;69;91
02;jack;71;87
03;alex;68;98
```
```
[root@localhost text]# cut -f2 -d";" test2.txt
Name
tom
jack
alex
```
### 指定字段的字符或者字节范围
cut命令可以将一串字符作为列来显示字符字段的记法
* **N-** 从第N个字节、字符、字段到结尾
* **N-M** 从第N个字节、字符、字段到第M个包括M在内字节、字符、字段
* **-M** 从第1个字节、字符、字段到第M个包括M在内字节、字符、字段。
上面是记法,结合下面选项将摸个范围的字节、字符指定为字段:
* **-b** 表示字节;
* **-c** 表示字符;
* **-f** 表示定义字段。
**示例**
```
[root@localhost text]# cat test.txt
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
```
打印第1个到第3个字符
```
[root@localhost text]# cut -c1-3 test.txt
abc
abc
abc
abc
abc
```
打印前2个字符
```
[root@localhost text]# cut -c-2 test.txt
ab
ab
ab
ab
ab
```
打印从第5个字符开始到结尾
```
[root@localhost text]# cut -c5- test.txt
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
```
## head
在屏幕上显示指定文件的开头若干行
### 补充说明
**head命令** 用于显示文件的开头的内容。在默认情况下head命令显示文件的头10行内容。
### 语法
```
head(选项)(参数)
```
### 选项
```
-n<数字>:指定显示头部内容的行数;
-c<字符数>:指定显示头部内容的字符数;
-v总是显示文件名的头信息
-q不显示文件名的头信息。
```
### 参数
文件列表:指定显示头部内容的文件列表。
## 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 -n +20 file 显示文件file的内容从第20行至文件末尾
tail -c 10 file 显示文件file的最后10个字符
```
## 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
```
## less
分屏上下翻页浏览文件内容
### 补充说明
**less命令** 的作用与more十分相似都可以用来浏览文字档案的内容不同的是less命令允许用户向前或向后浏览文件而more命令只能向前浏览。用less命令显示文件时用PageUp键向上翻页用PageDown键向下翻页。要退出less程序应按Q键。
### 语法
```
less(选项)(参数)
```
### 选项
```
-e文件内容显示完毕后自动退出
-f强制显示文件
-g不加亮显示搜索到的所有关键词仅显示当前显示的关键字以提高显示速度
-l搜索时忽略大小写的差异
-N每一行行首显示行号
-s将连续多个空行压缩成一行显示
-S在单行显示较长的内容而不换行显示
-x<数字>将TAB字符显示为指定个数的空格字符。
```
### 参数
文件:指定要分屏显示内容的文件。
## 实例
```bash
sudo less /var/log/shadowsocks.log
```

View File

@ -1,530 +0,0 @@
---
title: linux 常用命令-文件压缩与解压
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
<!-- TOC -->
- [linux 常用命令-文件压缩与解压](#linux-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4-%E6%96%87%E4%BB%B6%E5%8E%8B%E7%BC%A9%E4%B8%8E%E8%A7%A3%E5%8E%8B)
- [tar](#tar)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [zip格式](#zip%E6%A0%BC%E5%BC%8F)
- [tar格式该格式仅仅打包不压缩](#tar%E6%A0%BC%E5%BC%8F%EF%BC%88%E8%AF%A5%E6%A0%BC%E5%BC%8F%E4%BB%85%E4%BB%85%E6%89%93%E5%8C%85%EF%BC%8C%E4%B8%8D%E5%8E%8B%E7%BC%A9%EF%BC%89)
- [tar.gz格式](#targz%E6%A0%BC%E5%BC%8F)
- [tar.bz2格式](#tarbz2%E6%A0%BC%E5%BC%8F)
- [tar.xz格式](#tarxz%E6%A0%BC%E5%BC%8F)
- [tar.Z格式已过时](#tarz%E6%A0%BC%E5%BC%8F%EF%BC%88%E5%B7%B2%E8%BF%87%E6%97%B6%EF%BC%89)
- [jar格式](#jar%E6%A0%BC%E5%BC%8F)
- [7z格式](#7z%E6%A0%BC%E5%BC%8F)
- [其它例子](#%E5%85%B6%E5%AE%83%E4%BE%8B%E5%AD%90)
- [zip](#zip)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [问题解决](#%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3)
- [unzip](#unzip)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [gzip](#gzip)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
<!-- /TOC -->
# linux 常用命令-文件压缩与解压
## tar
Linux下的归档使用工具用来打包和备份。
### 补充说明
**tar命令** 可以为linux的文件和目录创建档案。利用tar可以为某一特定文件创建档案备份文件也可以在档案中改变文件或者向档案中加入新的文件。tar最初被用来在磁带上创建档案现在用户可以在任何设备上创建档案。利用tar命令可以把一大堆的文件和目录全部打包成一个文件这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。
首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。
为什么要区分这两个概念呢这源于Linux中很多压缩程序只能针对一个文件进行压缩这样当你想要压缩一大堆文件时你得先将这一大堆文件先打成一个包tar命令然后再用压缩程序进行压缩gzip bzip2命令
### 语法
```
tar(选项)(参数)
```
### 选项
```
-A或--catenate新增文件到以存在的备份文件
-B设置区块大小
-c或--create建立新的备份文件
-C <目录>:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
-d记录文件的差别
-x或--extract或--get从备份文件中还原文件
-t或--list列出备份文件的内容
-z或--gzip或--ungzip通过gzip指令处理备份文件
-Z或--compress或--uncompress通过compress指令处理备份文件
-f<备份文件>或--file=<备份文件>:指定备份文件;
-v或--verbose显示指令执行过程
-r添加文件到已经压缩的文件
-u添加改变了和现有的文件到已经存在的压缩文件
-j支持bzip2解压文件
-v显示操作过程
-l文件系统边界设置
-k保留原有文件不覆盖
-m保留文件不被覆盖
-w确认压缩文件的正确性
-p或--same-permissions用原来的文件权限还原文件
-P或--absolute-names文件名使用绝对名称不移除文件名称前的“/”号;
-N <日期格式> 或 --newer=<日期时间>:只将较指定日期更新的文件保存到备份文件里;
--exclude=<范本样式>:排除符合范本样式的文件。
```
### 参数
文件或目录:指定要打包的文件或目录列表。
### 实例
```bash
- z有gzip属性的
- j有bz2属性的
- Z有compress属性的
- v显示所有过程
- O将文件解开到标准输出
```
下面的参数-f是必须的
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。
```bash
tar -cf all.tar *.jpg
# 这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包-f指定包的文件名。
tar -rf all.tar *.gif
# 这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。
tar -uf all.tar logo.gif
# 这条命令是更新原来tar包all.tar中logo.gif文件-u是表示更新文件的意思。
tar -tf all.tar
# 这条命令是列出all.tar包中所有文件-t是列出文件的意思
```
```bash
tar -cfv archive.tar foo bar # 从文件foo和bar创建archive.tar。
tar -tvf archive.tar # 详细列出archive.tar中的所有文件。
tar -xf archive.tar # 从archive.tar提取所有文件。
```
#### zip格式
压缩: zip -r [目标文件名].zip [原文件/目录名]
解压: unzip [原文件名].zip
注:-r参数代表递归
#### tar格式该格式仅仅打包不压缩
打包tar -cvf [目标文件名].tar [原文件名/目录名]
解包tar -xvf [原文件名].tar
c参数代表create创建x参数代表extract解包v参数代表verbose详细信息f参数代表filename文件名所以f后必须接文件名。
#### tar.gz格式
方式一利用前面已经打包好的tar文件直接用压缩命令。
压缩gzip [原文件名].tar
解压gunzip [原文件名].tar.gz
方式二:一次性打包并压缩、解压并解包
打包并压缩: tar -zcvf [目标文件名].tar.gz [原文件名/目录名]
解压并解包: tar -zxvf [原文件名].tar.gz
z代表用gzip算法来压缩/解压。
#### tar.bz2格式
方式一利用已经打包好的tar文件直接执行压缩命令
压缩bzip2 [原文件名].tar
解压bunzip2 [原文件名].tar.bz2
方式二:一次性打包并压缩、解压并解包
打包并压缩: tar -jcvf [目标文件名].tar.bz2 [原文件名/目录名]
解压并解包: tar -jxvf [原文件名].tar.bz2
小写j代表用bzip2算法来压缩/解压。
#### tar.xz格式
方式一利用已经打包好的tar文件直接用压缩命令
压缩xz [原文件名].tar
解压unxz [原文件名].tar.xz
方式二:一次性打包并压缩、解压并解包
打包并压缩: tar -Jcvf [目标文件名].tar.xz [原文件名/目录名]
解压并解包: tar -Jxvf [原文件名].tar.xz
大写J代表用xz算法来压缩/解压。
#### tar.Z格式已过时
方式一利用已经打包好的tar文件直接用压缩命令
压缩compress [原文件名].tar
解压uncompress [原文件名].tar.Z
方式二:一次性打包并压缩、解压并解包
打包并压缩: tar -Zcvf [目标文件名].tar.Z [原文件名/目录名]
解压并解包: tar -Zxvf [原文件名].tar.Z
大写Z代表用ncompress算法来压缩/解压。另ncompress是早期Unix系统的压缩格式但由于ncompress的压缩率太低现已过时。
#### jar格式
压缩jar -cvf [目标文件名].jar [原文件名/目录名]
解压jar -xvf [原文件名].jar
如果是打包的是Java类库并且该类库中存在主类那么需要写一个META-INF/MANIFEST.MF配置文件内容如下
Manifest-Version: 1.0
Created-By: 1.6.0_27 (Sun Microsystems Inc.)
Main-class: the_name_of_the_main_class_should_be_put_here
然后用如下命令打包:
jar -cvfm [目标文件名].jar META-INF/MANIFEST.MF [原文件名/目录名]
这样以后就能用“java -jar [文件名].jar”命令直接运行主类中的public static void main方法了。
#### 7z格式
压缩7z a [目标文件名].7z [原文件名/目录名]
解压7z x [原文件名].7z
这个7z解压命令支持rar格式
7z x [原文件名].rar
#### 其它例子
**将文件全部打包成tar包**
```
tar -cvf log.tar log2012.log 仅打包,不压缩!
tar -zcvf log.tar.gz log2012.log 打包后,以 gzip 压缩
tar -jcvf log.tar.bz2 log2012.log 打包后,以 bzip2 压缩
```
在选项`f`之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。 如果加`z`选项,则以.tar.gz或.tgz来代表gzip压缩过的tar包如果加`j`选项,则以.tar.bz2来作为tar包名。
**查阅上述tar包内有哪些文件**
```
tar -ztvf log.tar.gz
```
由于我们使用 gzip 压缩的log.tar.gz所以要查阅log.tar.gz包内的文件时就得要加上`z`这个选项了。
**将tar包解压缩**
```
tar -zxvf /opt/soft/test/log.tar.gz
```
在预设的情况下,我们可以将压缩档在任何地方解开的
**只将tar内的部分文件解压出来**
```
tar -zxvf /opt/soft/test/log30.tar.gz log2013.log
```
我可以透过`tar -ztvf`来查阅 tar 包内的文件名称如果单只要一个文件就可以透过这个方式来解压部分文件
**文件备份下来,并且保存其权限**
```
tar -zcvpf log31.tar.gz log2014.log log2015.log log2016.log
```
这个`-p`的属性是很重要的,尤其是当您要保留原本文件的属性时。
**在文件夹当中,比某个日期新的文件才备份**
```
tar -N "2012/11/13" -zcvf log17.tar.gz test
```
**备份文件夹内容是排除部分文件:**
```
tar --exclude scf/service -zcvf scf.tar.gz scf/*
```
**其实最简单的使用 tar 就只要记忆底下的方式即可:**
```
 tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
 tar -jtv -f filename.tar.bz2
解压缩tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录
```
## zip
可以用来解压缩文件
### 补充说明
**zip命令** 可以用来解压缩文件或者对文件进行打包操作。zip是个使用广泛的压缩程序文件经它压缩后会另外产生具有“.zip”扩展名的压缩文件。
### 语法
```
zip(选项)(参数)
```
### 选项
```
-A调整可执行的自动解压缩文件
-b<工作目录>:指定暂时存放文件的目录;
-c替每个被压缩的文件加上注释
-d从压缩文件内删除指定的文件
-D压缩文件内不建立目录名称
-f此参数的效果和指定“-u”参数类似但不仅更新既有文件如果某些文件原本不存在于压缩文件内使用本参数会一并将其加入压缩文件中
-F尝试修复已损坏的压缩文件
-g将文件压缩后附加在已有的压缩文件之后而非另行建立新的压缩文件
-h在线帮助
-i<范本样式>:只压缩符合条件的文件;
-j只保存文件名称及其内容而不存放任何目录名称
-J删除压缩文件前面不必要的数据
-k使用MS-DOS兼容格式的文件名称
-l压缩文件时把LF字符置换成LF+CR字符
-ll压缩文件时把LF+cp字符置换成LF字符
-L显示版权信息
-m将文件压缩并加入压缩文件后删除原始文件即把文件移到压缩文件中
-n<字尾字符串>:不压缩具有特定字尾字符串的文件;
-o以压缩文件内拥有最新更改时间的文件为准将压缩文件的更改时间设成和该文件相同
-q不显示指令执行过程
-r递归处理将指定目录下的所有文件和子目录一并处理
-S包含系统和隐藏文件
-t<日期时间>:把压缩文件的日期设成指定的日期;
-T检查备份文件内的每个文件是否正确无误
-u更换较新的文件到压缩文件内
-v显示指令执行过程或显示版本信息
-V保存VMS操作系统的文件属性
-w在文件名称里假如版本编号本参数仅在VMS操作系统下有效
-x<范本样式>:压缩时排除符合条件的文件;
-X不保存额外的文件属性
-y直接保存符号连接而非该链接所指向的文件本参数仅在UNIX之类的系统下有效
-z替压缩文件加上注释
-$:保存第一个被压缩文件所在磁盘的卷册名称;
-<压缩效率>压缩效率是一个介于1~9的数值。
```
### 参数
* zip压缩包指定要创建的zip压缩包
* 文件列表:指定要压缩的文件列表。
### 实例
将`/home/Blinux/html/`这个目录下所有文件和文件夹打包为当前目录下的html.zip
```
zip -q -r html.zip /home/Blinux/html
```
上面的命令操作是将绝对地址的文件及文件夹进行压缩以下给出压缩相对路径目录比如目前在Bliux这个目录下执行以下操作可以达到以上同样的效果
```
zip -q -r html.zip html
```
比如现在我的html目录下我操作的zip压缩命令是
```
zip -q -r html.zip *
```
### 问题解决
CentOS7中命令找不到
```
-Bash: Unzip: Command Not Found
```
解决方法
```bash
yum install -y unzip zip
```
## unzip
用于解压缩由zip命令压缩的压缩包
### 补充说明
**unzip命令** 用于解压缩由zip命令压缩的“.zip”压缩包。
### 语法
```
unzip(选项)(参数)
```
### 选项
```
-c将解压缩的结果显示到屏幕上并对字符做适当的转换
-f更新现有的文件
-l显示压缩文件内所包含的文件
-p与-c参数类似会将解压缩的结果显示到屏幕上但不会执行任何的转换
-t检查压缩文件是否正确
-u与-f参数类似但是除了更新现有的文件外也会将压缩文件中的其他文件解压缩到目录中
-v执行时显示详细的信息
-z仅显示压缩文件的备注文字
-a对文本文件进行必要的字符转换
-b不要对文本文件进行字符转换
-C压缩文件中的文件名称区分大小写
-j不处理压缩文件中原有的目录路径
-L将压缩文件中的全部文件名改为小写
-M将输出结果送到more程序处理
-n解压缩时不要覆盖原有的文件
-o不必先询问用户unzip执行后覆盖原有的文件
-P<密码>使用zip的密码选项
-q执行时不显示任何信息
-s将文件名中的空白字符转换为底线字符
-V保留VMS的文件版本信息
-X解压缩时同时回存文件原来的UID/GID
-d<目录>:指定文件解压缩后所要存储的目录;
-x<文件>:指定不要处理.zip压缩文件中的哪些文件
-Zunzip-Z等于执行zipinfo指令。
```
### 参数
压缩包:指定要解压的“.zip”压缩包。
### 实例
将压缩文件text.zip在当前目录下解压缩。
```
unzip test.zip
```
将压缩文件text.zip在指定目录`/tmp`下解压缩如果已有相同的文件存在要求unzip命令不覆盖原先的文件。
```
unzip -n test.zip -d /tmp
```
查看压缩文件目录,但不解压。
```
unzip -v test.zip
```
将压缩文件test.zip在指定目录`/tmp`下解压缩如果已有相同的文件存在要求unzip命令覆盖原先的文件。
```
unzip -o test.zip -d tmp/
```
## gzip
用来压缩文件
### 补充说明
**gzip命令** 用来压缩文件。gzip是个使用广泛的压缩程序文件经它压缩过后其名称后面会多处“.gz”扩展名。
gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令既方便又好用。gzip不仅可以用来压缩大的、较少使用的文件以节省磁盘空间还可以和tar命令一起构成Linux操作系统中比较流行的压缩文件格式。据统计gzip命令对文本文件有60%70%的压缩率。减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。
### 语法
```
gzip(选项)(参数)
```
### 选项
```
-a或——ascii使用ASCII文字模式
-d或--decompress或----uncompress解开压缩文件
-f或——force强行压缩文件。不理会文件名称或硬连接是否存在以及该文件是否为符号连接
-h或——help在线帮助
-l或——list列出压缩文件的相关信息
-L或——license显示版本与版权信息
-n或--no-name压缩文件时不保存原来的文件名称及时间戳记
-N或——name压缩文件时保存原来的文件名称及时间戳记
-q或——quiet不显示警告信息
-r或——recursive递归处理将指定目录下的所有文件及子目录一并处理
-S或<压缩字尾字符串>或----suffix<压缩字尾字符串>:更改压缩字尾字符串;
-t或——test测试压缩文件是否正确无误
-v或——verbose显示指令执行过程
-V或——version显示版本信息
-<压缩效率>压缩效率是一个介于1~9的数值预设值为“6”指定愈大的数值压缩效率就会愈高
--best此参数的效果和指定“-9”参数相同
--fast此参数的效果和指定“-1”参数相同。
-num 用指定的数字num调整压缩的速度-1或--fast表示最快压缩方法低压缩比-9或--best表示最慢压缩方法高压缩比。系统缺省值为6。
```
### 参数
文件列表:指定要压缩的文件列表。
### 实例
把test6目录下的每个文件压缩成.gz文件
```
gzip *
```
把上例中每个压缩的文件解压,并列出详细的信息
```
gzip -dv *
```
详细显示例1中每个压缩的文件的信息并不解压
```
gzip -l *
```
压缩一个tar备份文件此时压缩文件的扩展名为.tar.gz
```
gzip -r log.tar
```
递归的压缩目录
```
gzip -rv test6
```
这样所有test下面的文件都变成了*.gz目录依然存在只是目录里面的文件相应变成了*.gz.这就是压缩,和打包不同。因为是对目录操作,所以需要加上-r选项这样也可以对子目录进行递归了。
递归地解压目录
```
gzip -dr test6
```

View File

@ -1,307 +0,0 @@
---
title: linux 常用命令-文件处理
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
<!-- TOC -->
- [linux 常用命令-文件处理](#linux-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4-%E6%96%87%E4%BB%B6%E5%A4%84%E7%90%86)
- [touch](#touch)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [ln](#ln)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [扩展知识](#%E6%89%A9%E5%B1%95%E7%9F%A5%E8%AF%86)
- [硬链接](#%E7%A1%AC%E9%93%BE%E6%8E%A5)
- [符号链接](#%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5)
- [cat](#cat)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [rename](#rename)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
<!-- /TOC -->
# linux 常用命令-文件处理
## touch
创建新的空文件
### 补充说明
**touch命令** 有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;二是用来创建新的空文件。
### 语法
```
touch(选项)(参数)
```
### 选项
```
-a或--time=atime或--time=access或--time=use 只更改存取时间;
-c或--no-create 不建立任何文件;
-d<时间日期> 使用指定的日期时间,而非现在的时间;
-f此参数将忽略不予处理仅负责解决BSD版本touch指令的兼容性问题
-m或--time=mtime或--time=modify 只更该变动时间;
-r<参考文件或目录> 把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同;
-t<日期时间> 使用指定的日期时间,而非现在的时间;
--help在线帮助
--version显示版本信息。
```
### 参数
文件:指定要设置时间属性的文件列表。
### 实例
```
touch ex2
```
在当前目录下建立一个空文件ex2然后利用`ls -l`命令可以发现文件ex2的大小为0表示它是空文件。
## ln
用来为文件创件连接
### 补充说明
**ln命令** 用来为文件创件连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用"-s"选项。
注意:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的。
### 语法
```
ln [选项]... [-T] 目标 链接名 (第一种格式)
 ln [选项]... 目标 (第二种格式)
 ln [选项]... 目标... 目录 (第三种格式)
 ln [选项]... -t 目录 目标... (第四种格式)
```
### 选项
```
--backup[=CONTROL] 为每个已存在的目标文件创建备份文件
-b 类似--backup但不接受任何参数
-d, -F, --directory 创建指向目录的硬链接(只适用于超级用户)
-f, --force 强行删除任何已存在的目标文件
-i, --interactive 覆盖既有文件之前先询问用户;
-L, --logical 取消引用作为符号链接的目标
-n, --no-dereference 把符号连接的目的目录视为一般文件;
-P, --physical 直接将硬链接到符号链接
-r, --relative 创建相对于链接位置的符号链接
-s, --symbolic 对源文件建立符号连接,而非硬连接;
-S, --suffix=SUFFIX 用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字符串是符号“~”,用户可通过“-S”参数来改变它
-t, --target-directory=DIRECTORY 指定要在其中创建链接的DIRECTORY
-T, --no-target-directory 将“LINK_NAME”视为常规文件
-v, --verbose 打印每个链接文件的名称
--help 显示此帮助信息并退出
--version 显示版本信息并退出
```
### 参数
* 源文件:指定连接的源文件。如果使用`-s`选项创建符号连接,则“源文件”可以是文件或者目录。创建硬连接时,则“源文件”参数只能是文件;
* 目标文件:指定源文件的目标连接文件。
```bash
none, off # 不进行备份(即使使用了--backup 选项)
numbered, t # 备份文件加上数字进行排序
existing, nil # 若有数字的备份文件已经存在则使用数字,否则使用普通方式备份
simple, never # 永远使用普通方式备份
```
### 实例
将目录`/usr/mengqc/mub1`下的文件m2.c链接到目录`/usr/liu`下的文件a2.c
```
cd /usr/mengqc
ln /mub1/m2.c /usr/liu/a2.c
```
在执行ln命令之前目录`/usr/liu`中不存在a2.c文件。执行ln之后在`/usr/liu`目录中才有a2.c这一项表明m2.c和a2.c链接起来注意二者在物理上是同一文件利用`ls -l`命令可以看到链接数的变化。
在目录`/usr/liu`下建立一个符号链接文件abc使它指向目录`/usr/mengqc/mub1`
```
ln -s /usr/mengqc/mub1 /usr/liu/abc
```
执行该命令后,`/usr/mengqc/mub1`代表的路径将存放在名为`/usr/liu/abc`的文件中。
### 扩展知识
Linux具有为一个文件起多个名字的功能称为链接。被链接的文件可以存放在相同的目录下但是必须有不同的文件名而不用在硬盘上为同样的数据重复备份。另外被链接的文件也可以有相同的文件名但是存放在不同的目录下这样只要对一个目录下的该文件进行修改就可以完成对所有目录下同名链接文件的修改。对于某个文件的各链接文件我们可以给它们指定不同的存取权限以控制对信息的共享和增强安全性。
文件链接有两种形式,即硬链接和符号链接。
### 硬链接
建立硬链接时在另外的目录或本目录中增加目标文件的一个目录项这样一个文件就登记在多个目录中。如图所示的m2.c文件就在目录mub1和liu中都建立了目录项。
创建硬链接后己经存在的文件的I节点号Inode会被多个目录文件项使用。一个文件的硬链接数可以在目录的长列表格式的第二列中看到无额外链接的文件的链接数为l。
在默认情况下ln命令创建硬链接。ln命令会增加链接数rm命令会减少链接数。一个文件除非链接数为0否则不会从文件系统中被物理地删除。
对硬链接有如下限制:
* 不能对目录文件做硬链接。
* 不能在不同的文件系统之间做硬链接。就是说,链接文件和被链接文件必须位于同一个文件系统中。
### 符号链接
符号链接也称为软链接是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。事实上它只是一个文本文件如图中的abc文件其中包含它提供链接的另一个文件的路径名如图中虚线箭头所示。另一个文件是实际包含所有数据的文件。所有读、写文件内容的命令被用于符号链接时将沿着链接方向前进来访问实际的文件。
!符号连接
与硬链接不同的是符号链接确实是一个新文件当然它具有不同的I节点号而硬链接并没有建立新文件。
符号链接没有硬链接的限制,可以对目录文件做符号链接,也可以在不同文件系统之间做符号链接。
用`ln -s`命令建立符号链接时,源文件最好用绝对路径名。这样可以在任何工作目录下进行符号链接。而当源文件用相对路径时,如果当前的工作路径与要创建的符号链接文件所在路径不同,就不能进行链接。
符号链接保持了链接与源文件或目录之间的区别:
* 删除源文件或目录,只删除了数据,不会删除链接。一旦以同样文件名创建了源文件,链接将继续指向该文件的新数据。
* 在目录长列表中符号链接作为一种特殊的文件类型显示出来其第一个字母是l。
* 符号链接的大小是其链接文件的路径名中的字节数。
* 当用`ln -s`命令列出文件时,可以看到符号链接名后有一个箭头指向源文件或目录,例如`lrwxrwxrwx … 14 jun 20 10:20 /etc/motd->/original_file`其中表示“文件大小”的数字“14”恰好说明源文件名`original_file`由14个字符构成。
## cat
连接文件并打印到标准输出设备上
### 补充说明
**cat命令** 连接文件并打印到标准输出设备上cat经常用来显示文件的内容类似于下的type命令。
注意当文件较大时文本在屏幕上迅速闪过滚屏用户往往看不清所显示的内容。因此一般用more等命令分屏显示。为了控制滚屏可以按Ctrl+S键停止滚屏按Ctrl+Q键可以恢复滚屏。按Ctrl+C中断键可以终止该命令的执行并且返回Shell提示符状态。
### 语法
```
cat(选项)(参数)
```
### 选项
```
-n或-number有1开始对所有输出的行数编号
-b或--number-nonblank和-n相似只不过对于空白行不编号
-s或--squeeze-blank当遇到有连续两行以上的空白行就代换为一行的空白行
-A显示不可打印字符行尾显示“$”;
-e等价于"-vE"选项;
-t等价于"-vT"选项;
```
### 参数
文件列表:指定要连接的文件列表。
### 实例
设ml和m2是当前目录下的两个文件
```
cat m1 在屏幕上显示文件ml的内容
cat m1 m2 同时显示文件ml和m2的内容
cat m1 m2 > file 将文件ml和m2合并后放入文件file中
```
## 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删掉
```

View File

@ -1,321 +0,0 @@
---
title: linux 常用命令-文件权限属性设置
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
<!-- TOC -->
- [linux 命令-文件权限属性设置](#linux-%E5%91%BD%E4%BB%A4-%E6%96%87%E4%BB%B6%E6%9D%83%E9%99%90%E5%B1%9E%E6%80%A7%E8%AE%BE%E7%BD%AE)
- [chmod](#chmod)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [知识扩展和实例](#%E7%9F%A5%E8%AF%86%E6%89%A9%E5%B1%95%E5%92%8C%E5%AE%9E%E4%BE%8B)
- [chown](#chown)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [stat](#stat)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [file](#file)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
<!-- /TOC -->
# linux 常用命令-文件权限属性设置
## chmod
用来变更文件或目录的权限
### 补充说明
**chmod命令** 用来变更文件或目录的权限。在UNIX系统家族里文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限设置方式采用文字或数字代号皆可。符号连接的权限无法变更如果用户对符号连接修改权限其改变会作用在被连接的原始文件。
权限范围的表示法如下:
`u` User即文件或目录的拥有者
`g` Group即文件或目录的所属群组
`o` Other除了文件或目录拥有者或所属群组之外其他用户皆属于这个范围
`a` All即全部的用户包含拥有者所属群组以及其他用户
`r` 读取权限数字代号为“4”;
`w` 写入权限数字代号为“2”
`x` 执行或切换权限数字代号为“1”
`-` 不具任何权限数字代号为“0”
`s` 特殊功能说明:变更文件或目录的权限。
### 语法
```
chmod(选项)(参数)
```
### 选项
```bash
u # 操作对象简称用户user文件或目录的所有者。
g # 操作对象简称同组用户group文件或目录所属群组
o # 操作对象简称其它用户others
a # 操作对象简称所有用户all系统默认使用此项
+ # 权限操作符,添加某些权限
- # 权限操作符,取消某些权限
= # 权限操作符,设置文件的权限为给定的权限
r # 权限设定(英文),表示可读权限
w # 权限设定(英文),表示可写权限
x # 权限设定(英文),表示可执行权限
- # 权限设定(英文字符),表示没有权限
X # 权限设定,如果目标文件是可执行文件或目录,可给其设置可执行权限
s # 权限设定设置权限suid和sgid使用权限组合“u+s”设定文件的用户的ID位“g+s”设置组ID位
t # 权限设定,只有目录或文件的所有者才可以删除目录下的文件
-c或——changes # 效果类似“-v”参数但仅回报更改的部分如果文件权限已经改变显示其操作信息
-f或--quiet或——silent # 操作过程中不显示任何错误信息;
-R或——recursive # 递归处理,将指令目录下的所有文件及子目录一并处理;
-v或——verbose # 显示命令运行时的详细执行过程;
--reference=<参考文件或目录> # 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;
<权限范围>+<权限设置> # 开启权限范围的文件或目录的该选项权限设置;
<权限范围>-<权限设置> # 关闭权限范围的文件或目录的该选项权限设置;
<权限范围>=<权限设置> # 指定权限范围的文件或目录的该选项权限设置;
--help # 显示帮助信息
--version # 显示版本信息
```
### 参数
权限模式:指定文件的权限模式;
文件:要改变权限的文件。
### 知识扩展和实例
Linux用 户分为:拥有者、组群(Group)、其他otherLinux系统中预设的情況下系统中所有的帐号与一般身份使用者以及root的相关信 息, 都是记录在`/etc/passwd`文件中。每个人的密码则是记录在`/etc/shadow`文件下。 此外,所有的组群名称记录在`/etc/group`內!
linux文件的用户权限的分析图
```bash
-rw-r--r-- 1 user staff 651 Oct 12 12:53 .gitmodules
# ↑╰┬╯╰┬╯╰┬╯
# ┆ ┆ ┆ ╰┈ 0 其他人
# ┆ ┆ ╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ g 属组
# ┆ ╰┈┈┈┈ u 属组
# ╰┈┈ 第一个字母 `d` 代表目录,`-` 代表普通文件
```
rwx rw- r--
r=读取属性  //值4
w=写入属性  //值2
x=执行属性  //值1
```bash
chmod u+x,g+w f01  # 为文件f01设置自己可以执行组员可以写入的权限
chmod u=rwx,g=rw,o=r f01
chmod 764 f01
chmod a+x f01   # 对文件f01的u,g,o都设置可执行属性
```
文件的属主和属组属性设置
```bash
chown user:market f01  # 把文件f01给uesr添加到market组
ll -d f1 查看目录f1的属性
```
将`/home/wwwroot/`里的所有文件和文件夹设置为`755`权限
(1)直接指定路径修改
```bash
chmod -R 755 /home/wwwroot/*
```
(2)手动进入该目录修改权限(并显示详细过程)
```bash
cd /home/wwwroot
chmod -Rv 755 * #注意:“*”表示通配符,指的是所有文件和文件
sudo chmod o+rw /shared #设置文件夹权限以保证其余用户可以访问它
```
## chown
用来变更文件或目录的拥有者或所属群组
### 补充说明
**chown命令** 改变某个文件或目录的所有者和所属的组该命令可以向某个用户授权使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D用户组可以是组名或组id。文件名可以使由空格分开的文件列表在文件名中可以包含通配符。
只有文件主和超级用户才可以便用该命令。
### 语法
```
chown(选项)(参数)
```
### 选项
```
-c或——changes效果类似“-v”参数但仅回报更改的部分
-f或--quite或——silent不显示错误信息
-h或--no-dereference只对符号连接的文件作修改而不更改其他任何相关文件
-R或——recursive递归处理将指定目录下的所有文件及子目录一并处理
-v或——version显示指令执行过程
--dereference效果和“-h”参数相同
--help在线帮助
--reference=<参考文件或目录>:把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同;
--version显示版本信息。
```
### 参数
用户:组:指定所有者和所属工作组。当省略“:组”,仅改变文件所有者;
文件指定要改变所有者和工作组的文件列表。支持多个文件和目标支持shell通配符。
### 实例
将目录`/usr/meng`及其下面的所有文件、子目录的文件主改成 liu
```
chown -R liu /usr/meng
```
## stat
用于显示文件的状态信息
### 补充说明
**stat命令** 用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。
### 语法
```
stat(选项)(参数)
```
### 选项
```
-L支持符号连接
-f显示文件系统状态而非文件状态
-t以简洁方式输出信息
--help显示指令的帮助信息
--version显示指令的版本信息。
```
### 参数
文件:指定要显示信息的普通文件或者文件系统对应的设备文件名。
### 实例
```
[root@localhost ~]# ls -l myfile
-rw-r--r-- 1 root root 0 2010-10-09 myfile
[root@localhost ~]# stat myfile
file: “myfile”
Size: 0 Blocks: 8 IO Block: 4096 一般空文件
Device: fd00h/64768d Inode: 194805815 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2010-12-12 12:22:35.000000000 +0800
Modify: 2010-10-09 20:44:21.000000000 +0800
Change: 2010-10-09 20:44:21.000000000 +0800
[root@localhost ~]# stat -f myfile
File: "myfile"
id: 0 Namelen: 255 type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 241555461 free: 232910771 Available: 220442547
Inodes: Total: 249364480 Free: 249139691
[root@localhost ~]# stat -t myfile
myfile 0 8 81a4 0 0 fd00 194805815 1 0 0 1292127755 1286628261 1286628261 4096
```
## file
用来探测给定文件的类型。
### 补充说明
**file命令** 用来探测给定文件的类型。file命令对文件的检查分为文件系统、魔法幻数检查和语言检查3个过程。
### 语法
```
file(选项)(参数)
```
### 选项
```
-b列出辨识结果时不显示文件名称
-c详细显示指令执行过程便于排错或分析程序执行的情形
-f<名称文件>指定名称文件其内容有一个或多个文件名称时让file依序辨识这些文件格式为每列一个文件名称
-L直接显示符号连接所指向的文件类别
-m<魔法数字文件>:指定魔法数字文件;
-v显示版本信息
-z尝试去解读压缩文件的内容。
```
### 参数
文件要确定类型的文件列表多个文件之间使用空格分开可以使用shell通配符匹配多个文件。
### 实例
显示文件类型
```
[root@localhost ~]# file install.log
install.log: UTF-8 Unicode text
[root@localhost ~]# file -b install.log <== 不显示文件名称
UTF-8 Unicode text
[root@localhost ~]# file -i install.log <== 显示MIME类别。
install.log: text/plain; charset=utf-8
[root@localhost ~]# file -b -i install.log
text/plain; charset=utf-8
```
显示符号链接的文件类型
```
[root@localhost ~]# ls -l /var/mail
lrwxrwxrwx 1 root root 10 08-13 00:11 /var/mail -> spool/mail
[root@localhost ~]# file /var/mail
/var/mail: symbolic link to `spool/mail'
[root@localhost ~]# file -L /var/mail
/var/mail: directory
[root@localhost ~]# file /var/spool/mail
/var/spool/mail: directory
[root@localhost ~]# file -L /var/spool/mail
/var/spool/mail: directory
```

View File

@ -1,667 +0,0 @@
---
title: linux 常用命令-文件查找和比较
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
<!-- TOC -->
- [linux 常用命令-文件查找和比较](#linux-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4-%E6%96%87%E4%BB%B6%E6%9F%A5%E6%89%BE%E5%92%8C%E6%AF%94%E8%BE%83)
- [diff](#diff)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [locate](#locate)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [which](#which)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [find](#find)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
- [根据文件或者正则表达式进行匹配](#%E6%A0%B9%E6%8D%AE%E6%96%87%E4%BB%B6%E6%88%96%E8%80%85%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E8%BF%9B%E8%A1%8C%E5%8C%B9%E9%85%8D)
- [否定参数](#%E5%90%A6%E5%AE%9A%E5%8F%82%E6%95%B0)
- [根据文件类型进行搜索](#%E6%A0%B9%E6%8D%AE%E6%96%87%E4%BB%B6%E7%B1%BB%E5%9E%8B%E8%BF%9B%E8%A1%8C%E6%90%9C%E7%B4%A2)
- [基于目录深度搜索](#%E5%9F%BA%E4%BA%8E%E7%9B%AE%E5%BD%95%E6%B7%B1%E5%BA%A6%E6%90%9C%E7%B4%A2)
- [根据文件时间戳进行搜索](#%E6%A0%B9%E6%8D%AE%E6%96%87%E4%BB%B6%E6%97%B6%E9%97%B4%E6%88%B3%E8%BF%9B%E8%A1%8C%E6%90%9C%E7%B4%A2)
- [根据文件大小进行匹配](#%E6%A0%B9%E6%8D%AE%E6%96%87%E4%BB%B6%E5%A4%A7%E5%B0%8F%E8%BF%9B%E8%A1%8C%E5%8C%B9%E9%85%8D)
- [删除匹配文件](#%E5%88%A0%E9%99%A4%E5%8C%B9%E9%85%8D%E6%96%87%E4%BB%B6)
- [根据文件权限/所有权进行匹配](#%E6%A0%B9%E6%8D%AE%E6%96%87%E4%BB%B6%E6%9D%83%E9%99%90%E6%89%80%E6%9C%89%E6%9D%83%E8%BF%9B%E8%A1%8C%E5%8C%B9%E9%85%8D)
- [借助`-exec`选项与其他命令结合使用](#%E5%80%9F%E5%8A%A9-exec%E9%80%89%E9%A1%B9%E4%B8%8E%E5%85%B6%E4%BB%96%E5%91%BD%E4%BB%A4%E7%BB%93%E5%90%88%E4%BD%BF%E7%94%A8)
- [搜索但跳出指定的目录](#%E6%90%9C%E7%B4%A2%E4%BD%86%E8%B7%B3%E5%87%BA%E6%8C%87%E5%AE%9A%E7%9A%84%E7%9B%AE%E5%BD%95)
- [find其他技巧收集](#find%E5%85%B6%E4%BB%96%E6%8A%80%E5%B7%A7%E6%94%B6%E9%9B%86)
- [whereis](#whereis)
- [补充说明](#%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E)
- [语法](#%E8%AF%AD%E6%B3%95)
- [选项](#%E9%80%89%E9%A1%B9)
- [参数](#%E5%8F%82%E6%95%B0)
- [实例](#%E5%AE%9E%E4%BE%8B)
<!-- /TOC -->
# linux 常用命令-文件查找和比较
## diff
比较给定的两个文件的不同
### 补充说明
**diff命令** 在最简单的情况下,比较给定的两个文件的不同。如果使用“-”代替“文件”参数则要比较的内容将来自标准输入。diff命令是以逐行的方式比较文本文件的异同处。如果该命令指定进行目录的比较则将会比较该目录中具有相同文件名的文件而不会对其子目录文件进行任何比较操作。
### 语法
```
diff(选项)(参数)
```
### 选项
```
-<行数>:指定要显示多少行的文本。此参数必须与-c或-u参数一并使用
-a或——textdiff预设只会逐行比较文本文件
-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参数时仅显示不同之处。
```
### 参数
* 文件1指定要比较的第一个文件
* 文件2指定要比较的第二个文件。
### 实例
将目录`/usr/li`下的文件"test.txt"与当前目录下的文件"test.txt"进行比较,输入如下命令:
```
diff /usr/li test.txt #使用diff指令对文件进行比较
```
上面的命令执行后,会将比较后的不同之处以指定的形式列出,如下所示:
```
n1 a n3,n4
n1,n2 d n3
n1,n2 c n3,n4
```
其中,字母"a"、"d"、"c"分别表示添加、删除及修改操作。而"n1"、"n2"表示在文件1中的行号"n3"、"n4"表示在文件2中的行号。
注意:以上说明指定了两个文件中不同处的行号及其相应的操作。在输出形式中,每一行后面将跟随受到影响的若干行。其中,以<开始的行属于文件1>开始的行属于文件2。
## locate
Apache服务器的性能测试工具
### 补充说明
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了。在一般的 distribution 之中,数据库的建立都被放在 crontab 中自动执行。
locate命令可以在搜寻数据库时快速找到档案数据库由updatedb程序来更新updatedb是由cron daemon周期性建立的locate命令在搜寻数据库时比由整个由硬盘资料来搜寻资料来得快但较差劲的是locate所找到的档案若是最近才建立或 刚更名的可能会找不到在内定值中updatedb每天会跑一次可以由修改crontab来更新设定值。(etc/crontab)
locate指定用在搜寻符合条件的档案它会去储存档案与目录名称的数据库内寻找合乎范本样式条件的档案或目录录可以使用特殊字元如”*” 或”?”等来指定范本样式如指定范本为kcpa*ner, locate 会找出所有起始字串为kcpa且结尾为ner的档案或目录如名称为kcpartner若目录录名称为kcpa_ner则会列出该目录下包括 子目录在内的所有档案。
locate指令和find找寻档案的功能类似但locate是透过update程序将硬盘中的所有档案和目录资料先建立一个索引数据库在 执行loacte时直接找该索引查询速度会较快索引数据库一般是由操作系统管理但也可以直接下达update强迫系统立即修改索引数据库。
### 语法
```
locate [选择参数] [样式]
```
### 选项
```
-e 将排除在寻找的范围之外。
-1 如果 是 1则启动安全模式。在安全模式下使用者不会看到权限无法看到 的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的 权限资料。
-f 将特定的档案系统排除在外,例如我们没有到理要把 proc 档案系统中的档案 放在资料库中。
-q 安静模式,不会显示任何错误讯息。
-n 至多显示 n个输出。
-r 使用正规运算式 做寻找的条件。
-o 指定资料库存的名称。
-d 指定资料库的路径
-h 显示辅助讯息
-V 显示程式的版本讯息
```
### 实例
实例1查找和pwd相关的所有文件
```
root ~ # locate pwd
/bin/pwd
/etc/.pwd.lock
/sbin/unix_chkpwd
/usr/bin/pwdx
/usr/include/pwd.h
/usr/lib/python2.7/dist-packages/twisted/python/fakepwd.py
/usr/lib/python2.7/dist-packages/twisted/python/fakepwd.pyc
/usr/lib/python2.7/dist-packages/twisted/python/test/test_fakepwd.py
/usr/lib/python2.7/dist-packages/twisted/python/test/test_fakepwd.pyc
/usr/lib/syslinux/pwd.c32
/usr/share/help/C/empathy/irc-join-pwd.page
/usr/share/help/ca/empathy/irc-join-pwd.page
/usr/share/help/cs/empathy/irc-join-pwd.page
/usr/share/help/de/empathy/irc-join-pwd.page
/usr/share/help/el/empathy/irc-join-pwd.page
```
实例2 搜索etc目录下所有以sh开头的文件
```
root ~ # locate /etc/sh
/etc/shadow
/etc/shadow-
/etc/shells
```
实例3搜索etc目录下所有以m开头的文件
```
root ~ # locate /etc/m
/etc/magic
/etc/magic.mime
/etc/mailcap
/etc/mailcap.order
/etc/manpath.config
/etc/mate-settings-daemon
```
## which
查找并显示给定命令的绝对路径
### 补充说明
**which命令** 用于查找并显示给定命令的绝对路径环境变量PATH中保存了查找命令时需要遍历的目录。which指令会在环境变量$PATH设置的目录里查找符合条件的文件。也就是说使用which命令就可以看到某个系统命令是否存在以及执行的到底是哪一个位置的命令。
### 语法
```
which(选项)(参数)
```
### 选项
```
-n<文件名长度>:制定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名;
-p<文件名长度>:与-n参数相同但此处的<文件名长度>包含了文件的路径;
-w指定输出时栏位的宽度
-V显示版本信息。
```
### 参数
指令名:指令名列表。
### 实例
查找文件、显示命令路径:
```
[root@localhost ~]# which pwd
/bin/pwd
[root@localhost ~]# which adduser
/usr/sbin/adduser
```
说明which是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的所以不同的 PATH 配置内容所找到的命令当然不一样的
用 which 去找出 cd
```
[root@localhost ~]# which cd
cd: shell built-in command
```
cd 这个常用的命令竟然找不到啊!为什么呢?这是因为 cd 是bash 内建的命令! 但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的!
## find
在指定目录下查找文件
### 补充说明
**find命令** 用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时不设置任何参数则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
### 语法
```
find(选项)(参数)
```
### 选项
```
-amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
-anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
-atime<24小时数>查找在指定时间曾被存取过的文件或目录单位以24小时计算
-cmin<分钟>:查找在指定时间之时被更改过的文件或目录;
-cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-ctime<24小时数>查找在指定时间之时被更改的文件或目录单位以24小时计算
-daystart从本日开始计算时间
-depth从指定目录下最深层的子目录开始查找
-expty寻找文件大小为0 Byte的文件或目录下没有任何子目录或文件的空目录
-exec<执行指令>假设find指令的回传值为True就执行该指令
-false将find指令的回传值皆设为False
-fls<列表文件>:此参数的效果和指定“-ls”参数类似但会把结果保存为指定的列表文件
-follow排除符号连接
-fprint<列表文件>:此参数的效果和指定“-print”参数类似但会把结果保存成指定的列表文件
-fprint0<列表文件>:此参数的效果和指定“-print0”参数类似但会把结果保存成指定的列表文件
-fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似但会把结果保存成指定的列表文件
-fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
-gid<群组识别码>:查找符合指定之群组识别码的文件或目录;
-group<群组名称>:查找符合指定之群组名称的文件或目录;
-help或——help在线帮助
-ilname<范本样式>:此参数的效果和指定“-lname”参数类似但忽略字符大小写的差别
-iname<范本样式>:此参数的效果和指定“-name”参数类似但忽略字符大小写的差别
-inum<inode编号>查找符合指定的inode编号的文件或目录
-ipath<范本样式>:此参数的效果和指定“-path”参数类似但忽略字符大小写的差别
-iregex<范本样式>:此参数的效果和指定“-regexe”参数类似但忽略字符大小写的差别
-links<连接数目>:查找符合指定的硬连接数目的文件或目录;
-iname<范本样式>:指定字符串作为寻找符号连接的范本样式;
-ls假设find指令的回传值为Ture就将文件或目录名称列出到标准输出
-maxdepth<目录层级>:设置最大目录层级;
-mindepth<目录层级>:设置最小目录层级;
-mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
-mount此参数的效果和指定“-xdev”相同
-mtime<24小时数>查找在指定时间曾被更改过的文件或目录单位以24小时计算
-name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-nogroup找出不属于本地主机群组识别码的文件或目录
-noleaf不去考虑目录至少需拥有两个硬连接存在
-nouser找出不属于本地主机用户识别码的文件或目录
-ok<执行指令>:此参数的效果和指定“-exec”类似但在执行指令之前会先询问用户若回答“y”或“Y”则放弃执行命令
-path<范本样式>:指定字符串作为寻找目录的范本样式;
-perm<权限数值>:查找符合指定的权限数值的文件或目录;
-print假设find指令的回传值为Ture就将文件或目录名称列出到标准输出。格式为每列一个名称每个名称前皆有“./”字符串;
-print0假设find指令的回传值为Ture就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行
-printf<输出格式>假设find指令的回传值为Ture就将文件或目录名称列出到标准输出。格式可以自行指定
-prune不寻找字符串作为寻找文件或目录的范本样式;
-regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-size<文件大小>:查找符合指定的文件大小的文件;
-true将find指令的回传值皆设为True
-typ<文件类型>:只寻找符合指定的文件类型的文件;
-uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
-used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
-user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
-version或——version显示版本信息
-xdev将范围局限在先行的文件系统中
-xtype<文件类型>:此参数的效果和指定“-type”参数类似差别在于它针对符号连接检查。
```
### 参数
起始目录:查找文件的起始目录。
### 实例
```bash
# 当前目录搜索所有文件,文件内容 包含 “140.206.111.111” 的内容
find . -type f -name "*" | xargs grep "140.206.111.111"
```
#### 根据文件或者正则表达式进行匹配
列出当前目录及子目录下所有文件和文件夹
```
find .
```
在`/home`目录下查找以.txt结尾的文件名
```
find /home -name "*.txt"
```
同上,但忽略大小写
```
find /home -iname "*.txt"
```
当前目录及子目录下查找所有以.txt和.pdf结尾的文件
```
find . \( -name "*.txt" -o -name "*.pdf" \)
find . -name "*.txt" -o -name "*.pdf"
```
匹配文件路径或者文件
```
find /usr/ -path "*local*"
```
基于正则表达式匹配文件路径
```
find . -regex ".*\(\.txt\|\.pdf\)$"
```
同上,但忽略大小写
```
find . -iregex ".*\(\.txt\|\.pdf\)$"
```
#### 否定参数
找出/home下不是以.txt结尾的文件
```
find /home ! -name "*.txt"
```
#### 根据文件类型进行搜索
```
find . -type 类型参数
```
类型参数列表:
* **f** 普通文件
* **l** 符号连接
* **d** 目录
* **c** 字符设备
* **b** 块设备
* **s** 套接字
* **p** Fifo
#### 基于目录深度搜索
向下最大深度限制为3
```
find . -maxdepth 3 -type f
```
搜索出深度距离当前目录至少2个子目录的所有文件
```
find . -mindepth 2 -type f
```
#### 根据文件时间戳进行搜索
```
find . -type f 时间戳
```
UNIX/Linux文件系统每个文件都有三种时间戳
* **访问时间** -atime/天,-amin/分钟):用户最近一次访问时间。
* **修改时间** -mtime/天,-mmin/分钟):文件最后一次修改时间。
* **变化时间** -ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
搜索最近七天内被访问过的所有文件
```
find . -type f -atime -7
```
搜索恰好在七天前被访问过的所有文件
```
find . -type f -atime 7
```
搜索超过七天内被访问过的所有文件
```
find . -type f -atime +7
```
搜索访问时间超过10分钟的所有文件
```
find . -type f -amin +10
```
找出比file.log修改时间更长的所有文件
```
find . -type f -newer file.log
```
#### 根据文件大小进行匹配
```
find . -type f -size 文件大小单元
```
文件大小单元:
* **b** —— 块512字节
* **c** —— 字节
* **w** —— 字2字节
* **k** —— 千字节
* **M** —— 兆字节
* **G** —— 吉字节
搜索大于10KB的文件
```
find . -type f -size +10k
```
搜索小于10KB的文件
```
find . -type f -size -10k
```
搜索等于10KB的文件
```
find . -type f -size 10k
```
#### 删除匹配文件
删除当前目录下所有.txt文件
```
find . -type f -name "*.txt" -delete
```
#### 根据文件权限/所有权进行匹配
当前目录下搜索出权限为777的文件
```
find . -type f -perm 777
```
找出当前目录下权限不是644的php文件
```
find . -type f -name "*.php" ! -perm 644
```
找出当前目录用户tom拥有的所有文件
```
find . -type f -user tom
```
找出当前目录用户组sunk拥有的所有文件
```
find . -type f -group sunk
```
#### 借助`-exec`选项与其他命令结合使用
找出当前目录下所有root的文件并把所有权更改为用户tom
```
find .-type f -user root -exec chown tom {} \;
```
上例中, **{}** 用于与 **-exec** 选项结合使用来匹配所有文件,然后会被替换为相应的文件名。
找出自己家目录下所有的.txt文件并删除
```
find $HOME/. -name "*.txt" -ok rm {} \;
```
上例中, **-ok** 和 **-exec** 行为一样,不过它会给出提示,是否执行相应的操作。
查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中
```
find . -type f -name "*.txt" -exec cat {} \;> all.txt
```
将30天前的.log文件移动到old目录中
```
find . -type f -mtime +30 -name "*.log" -exec cp {} old \;
```
找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来
```
find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;
```
因为单行命令中-exec参数中无法使用多个命令以下方法可以实现在-exec之后接受多条命令
```
-exec ./text.sh {} \;
```
#### 搜索但跳出指定的目录
查找当前目录或者子目录下所有.txt文件但是跳过子目录sk
```
find . -path "./sk" -prune -o -name "*.txt" -print
```
#### find其他技巧收集
要列出所有长度为零的文件
```
find . -empty
```
## whereis
查找二进制程序、代码等相关文件路径
### 补充说明
**whereis命令** 用来定位指令的二进制程序、源代码文件和man手册页等相关文件的路径。
whereis命令只能用于程序名的搜索而且只搜索二进制文件参数-b、man说明文件参数-m和源代码文件参数-s。如果省略参数则返回所有信息。
和find相比whereis查找的速度非常快这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中当使用whereis和下面即将介绍的locate时会从数据库中查找数据而不是像find命令那样 过遍历硬盘来查找效率自然会很高。 但是该数据库文件并不是实时更新默认情况下时一星期更新一次因此我们在用whereis和locate 查找文件时有时会找到已经被删除的数据或者刚刚建立文件却无法查找到原因就是因为数据库文件没有被更新。
### 语法
```
whereis(选项)(参数)
```
### 选项
```
-b只查找二进制文件
-B<目录>:只在设置的目录下查找二进制文件;
-f不显示文件名前的路径名称
-m只查找说明文件
-M<目录>:只在设置的目录下查找说明文件;
-s只查找原始代码文件
-S<目录>只在设置的目录下查找原始代码文件;
-u查找不包含指定类型的文件。
```
### 参数
指令名要查找的二进制程序、源文件和man手册页的指令名。
### 实例
将相关的文件都查找出来
```
[root@localhost ~]# whereis tomcat
tomcat:
[root@localhost ~]# whereis svn
svn: /usr/bin/svn /usr/local/svn /usr/share/man/man1/svn.1.gz
```
说明tomcat没安装找不出来svn安装找出了很多相关文件
只将二进制文件查找出来 
```
[root@localhost ~]# whereis -b svn
svn: /usr/bin/svn /usr/local/svn
[root@localhost ~]# whereis -m svn
svn: /usr/share/man/man1/svn.1.gz
[root@localhost ~]# whereis -s svn
svn:
```
说明:`whereis -m svn`查出说明文档路径,`whereis -s svn`找source源文件。

View File

@ -1,549 +0,0 @@
---
title: linux 常用命令-文件编辑
date: 2018/02/27
categories:
- linux
tags:
- linux
- command
---
<!-- TOC -->
- [linux 常用命令-文件编辑](#linux-常用命令-文件编辑)
- [sed](#sed)
- [补充说明](#补充说明)
- [sed的选项、命令、替换标记](#sed的选项命令替换标记)
- [选项](#选项)
- [参数](#参数)
- [sed命令](#sed命令)
- [sed替换标记](#sed替换标记)
- [sed元字符集](#sed元字符集)
- [sed用法实例](#sed用法实例)
- [替换操作s命令](#替换操作s命令)
- [全面替换标记g](#全面替换标记g)
- [定界符](#定界符)
- [删除操作d命令](#删除操作d命令)
- [已匹配字符串标记&](#已匹配字符串标记)
- [子串匹配标记\1](#子串匹配标记\1)
- [组合多个表达式](#组合多个表达式)
- [引用](#引用)
- [选定行的范围:,(逗号)](#选定行的范围逗号)
- [多点编辑e命令](#多点编辑e命令)
- [从文件读入r命令](#从文件读入r命令)
- [写入文件w命令](#写入文件w命令)
- [追加行下a\命令](#追加行下a\命令)
- [插入行上i\命令](#插入行上i\命令)
- [下一个n命令](#下一个n命令)
- [变形y命令](#变形y命令)
- [退出q命令](#退出q命令)
- [保持和获取h命令和G命令](#保持和获取h命令和g命令)
- [保持和互换h命令和x命令](#保持和互换h命令和x命令)
- [脚本scriptfile](#脚本scriptfile)
- [打印奇数行或偶数行](#打印奇数行或偶数行)
- [打印匹配字符串的下一行](#打印匹配字符串的下一行)
- [vi](#vi)
- [补充说明](#补充说明-1)
- [语法](#语法)
- [选项](#选项-1)
- [参数](#参数-1)
- [知识扩展](#知识扩展)
<!-- /TOC -->
# linux 常用命令-文件编辑
## sed
功能强大的流式文本编辑器
### 补充说明
**sed** 是一种流编辑器它是文本处理中非常中的工具能够完美的配合正则表达式使用功能不同凡响。处理时把当前处理的行存储在临时缓冲区中称为“模式空间”pattern space接着用sed命令处理缓冲区中的内容处理完成后把缓冲区的内容送往屏幕。接着处理下一行这样不断重复直到文件末尾。文件内容并没有 改变除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件简化对文件的反复操作编写转换程序等。
### sed的选项、命令、替换标记
**命令格式**
```
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
```
### 选项
```
-e<script>--expression=<script>script
-f<script文件>--file=<script>script
-h或--help显示帮助
-n或--quiet或——silent仅显示script处理后的结果
-V或--version显示版本信息。
```
### 参数
文件:指定待处理的文本文件列表。
### sed命令
```
**a\** 在当前行下面插入文本。
**i\** 在当前行上面插入文本。
**c\** 把选定的行改为新的文本。
**d** 删除,删除选择的行。
**D** 删除模板块的第一行。
**s** 替换指定字符
**h** 拷贝模板块的内容到内存中的缓冲区。
**H** 追加模板块的内容到内存中的缓冲区。
**g** 获得内存缓冲区的内容,并替代当前模板块中的文本。
**G** 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
**l** 列表不能打印字符的清单。
**n** 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
**N** 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
**p** 打印模板块的行。
**P** (大写) 打印模板块的第一行。
**q** 退出Sed。
**b lable** 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
**r file** 从file中读行。
**t label** if分支从最后一行开始条件一旦满足或者Tt命令将导致分支到带有标号的命令处或者到脚本的末尾。
**T label** 错误分支从最后一行开始一旦发生错误或者Tt命令将导致分支到带有标号的命令处或者到脚本的末尾。
**w file** 写并追加模板块到file末尾。
**W file** 写并追加模板块的第一行到file末尾。
**!** 表示后面的命令对所有没有被选定的行发生作用。
**=** 打印当前行号码。
**#** 把注释扩展到下一个换行符以前。
```
### sed替换标记
```
**g** 表示行内全面替换。
**p** 表示打印行。
**w** 表示把行写入一个文件。
**x** 表示互换模板块中的文本和缓冲区中的文本。
**y** 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
**\1** 子串匹配标记
**&** 已匹配字符串标记
```
### sed元字符集
```
**^** 匹配行开始,如:/^sed/匹配所有以sed开头的行。
**$** 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
**.** 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符最后是d。
**** * 匹配0个或多个字符/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
**[]** 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
**[^]** 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头紧跟ed的行。
**\(..\)** 匹配子串保存匹配的字符如s/\(love\)able/\1rsloveable被替换成lovers。
**&** 保存搜索字符用来替换其他字符如s/love/ **&** /love这成 **love**
**\<** 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
**\>** 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
**x\{m\}** 重复字符xm次/0\{5\}/匹配包含5个0的行。
**x\{m,\}** 重复字符x至少m次/0\{5,\}/匹配至少有5个0的行。
**x\{m,n\}** 重复字符x至少m次不多于n次/0\{5,10\}/匹配5~10个0的行。
```
### sed用法实例
#### 替换操作s命令
替换文本中的字符串:
```
sed 's/book/books/' file
```
**-n选项** 和 **p命令** 一起使用表示只打印那些发生替换的行:
sed -n 's/test/TEST/p' file
直接编辑文件 **选项-i** 会匹配file文件中每一行的第一个book替换为books
```
sed -i 's/book/books/g' file
```
#### 全面替换标记g
使用后缀 /g 标记会替换每一行中的所有匹配:
```
sed 's/book/books/g' file
```
当需要从第N处匹配开始替换时可以使用 /Ng
```
echo sksksksksksk | sed 's/sk/SK/2g'
skSKSKSKSKSK
echo sksksksksksk | sed 's/sk/SK/3g'
skskSKSKSKSK
echo sksksksksksk | sed 's/sk/SK/4g'
skskskSKSKSK
```
#### 定界符
以上命令中字符 / 在sed中作为定界符使用也可以使用任意的定界符
```
sed 's:test:TEXT:g'
sed 's|test|TEXT|g'
```
定界符出现在样式内部时,需要进行转义:
```
sed 's/\/bin/\/usr\/local\/bin/g'
```
#### 删除操作d命令
删除空白行:
```
sed '/^$/d' file
```
删除文件的第2行
```
sed '2d' file
```
删除文件的第2行到末尾所有行
```
sed '2,$d' file
```
删除文件最后一行:
```
sed '$d' file
```
删除文件中所有开头是test的行
```
sed '/^test/'d file
```
#### 已匹配字符串标记&
正则表达式 \w\+ 匹配每一个单词,使用 [&] 替换它,& 对应于之前所匹配到的单词:
```
echo this is a test line | sed 's/\w\+/[&]/g'
[this] [is] [a] [test] [line]
```
所有以192.168.0.1开头的行都会被替换成它自已加localhost
```
sed 's/^192.168.0.1/&localhost/' file
192.168.0.1localhost
```
#### 子串匹配标记\1
匹配给定样式的其中一部分:
```
echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
this is 7 in a number
```
命令中 digit 7被替换成了 7。样式匹配到的子串是 7\(..\) 用于匹配子串,对于匹配到的第一个子串就标记为 **\1** ,依此类推匹配到的第二个结果就是 **\2** ,例如:
```
echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
BBB aaa
```
love被标记为1所有loveable会被替换成lovers并打印出来
```
sed -n 's/\(love\)able/\1rs/p' file
```
#### 组合多个表达式
```
sed '表达式' | sed '表达式'
等价于:
sed '表达式; 表达式'
```
#### 引用
sed表达式可以使用单引号来引用但是如果表达式内部包含变量字符串就需要使用双引号。
```
test=hello
echo hello WORLD | sed "s/$test/HELLO"
HELLO WORLD
```
#### 选定行的范围:,(逗号)
所有在模板test和check所确定的范围内的行都被打印
```
sed -n '/test/,/check/p' file
```
打印从第5行开始到第一个包含以test开始的行之间的所有行
```
sed -n '5,/^test/p' file
```
对于模板test和west之间的行每行的末尾用字符串aaa bbb替换
```
sed '/test/,/west/s/$/aaa bbb/' file
```
#### 多点编辑e命令
-e选项允许在同一行里执行多条命令
```
sed -e '1,5d' -e 's/test/check/' file
```
上面sed表达式的第一条命令删除1至5行第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令那么第一个替换命令将影响第二个替换命令的结果。
和 -e 等价的命令是 --expression
```
sed --expression='s/test/check/' --expression='/love/d' file
```
#### 从文件读入r命令
file里的内容被读进来显示在与test匹配的行后面如果匹配多行则file的内容将显示在所有匹配行的下面
```
sed '/test/r file' filename
```
#### 写入文件w命令  
在example中所有包含test的行都被写入file里
```
sed -n '/test/w file' example
```
#### 追加行下a\命令
将 this is a test line 追加到 以test 开头的行后面:
```
sed '/^test/a\this is a test line' file
```
在 test.conf 文件第2行之后插入 this is a test line
```
sed -i '2a\this is a test line' test.conf
```
#### 插入行上i\命令
将 this is a test line 追加到以test开头的行前面
```
sed '/^test/i\this is a test line' file
```
在test.conf文件第5行之前插入this is a test line
```
sed -i '5i\this is a test line' test.conf
```
#### 下一个n命令
如果test被匹配则移动到匹配行的下一行替换这一行的aa变为bb并打印该行然后继续
```
sed '/test/{ n; s/aa/bb/; }' file
```
#### 变形y命令
把1~10行内所有abcde转变为大写注意正则表达式元字符不能使用这个命令
```
sed '1,10y/abcde/ABCDE/' file
```
#### 退出q命令
打印完第10行后退出sed
```
sed '10q' file
```
#### 保持和获取h命令和G命令
在sed处理文件的时候每一行都被保存在一个叫模式空间的临时缓冲区中除非行被删除或者输出被取消否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。
```
sed -e '/test/h' -e '$G' file
```
在这个例子里匹配test的行被找到后将存入模式空间h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是当到达最后一行后G命令取出保持缓冲区的行然后把它放回模式空间中且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说任何包含test的行都被复制并追加到该文件的末尾。
#### 保持和互换h命令和x命令
互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换
```
sed -e '/test/h' -e '/check/x' file
```
#### 脚本scriptfile
sed脚本是一个sed的命令清单启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔在命令的末尾不能有任何空白或文本如果在一行中有多个命令要用分号分隔。以#开头的行为注释行,且不能跨行。
```
sed [options] -f scriptfile file(s)
```
#### 打印奇数行或偶数行
方法1
```
sed -n 'p;n' test.txt #奇数行
sed -n 'n;p' test.txt #偶数行
```
方法2
```
sed -n '1~2p' test.txt #奇数行
sed -n '2~2p' test.txt #偶数行
```
#### 打印匹配字符串的下一行
```
grep -A 1 SCC URFILE
sed -n '/SCC/{n;p}' URFILE
awk '/SCC/{getline; print}' URFILE
```
## 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.jpg](http://man.linuxde.net/wp-content/uploads/2013/11/vi.jpg)

File diff suppressed because it is too large Load Diff