# Linux 常用Shell命令

<nav>
<a href="#一Linux目录结构">一、Linux目录结构</a><br/>
<a href="#二帮助命令">二、帮助命令</a><br/>
<a href="#三Yum相关命令">三、Yum相关命令</a><br/>
<a href="#四服务相关命令">四、服务相关命令</a><br/>
<a href="#五常用系统命令">五、常用系统命令</a><br/>
<a href="#六状态检测命令">六、状态检测命令</a><br/>
<a href="#七目录相关命令">七、目录相关命令</a><br/>
<a href="#八文件编辑命令">八、文件编辑命令 </a><br/>
<a href="#九文件管理命令">九、文件管理命令</a><br/>
<a href="#十压缩与搜索命令">十、压缩与搜索命令</a><br/>
<a href="#十一用户管理相关命令">十一、用户管理相关命令</a><br/>
<a href="#十二文件权限相关命令">十二、文件权限相关命令</a><br/>
<a href="#十三Vim编辑器常用命令">十三、Vim编辑器常用命令</a><br/>
<a href="#十四输入输出重定向">十四、输入输出重定向</a><br/>
</nav>

## 一、Linux目录结构

| 目录名称    | 应放置文件的内容                                          |
| ----------- | --------------------------------------------------------- |
| /boot       | 开机所需文件—内核、开机菜单以及所需配置文件等             |
| /dev        | 以文件形式存放任何设备与接口                              |
| /etc        | 配置文件                                                  |
| /home       | 用户主目录                                                |
| /bin        | 存放单用户模式下还可以操作的命令                          |
| /lib        | 开机时用到的函数库，以及/bin与/sbin下面的命令要调用的函数 |
| /sbin       | 开机过程中需要的命令                                      |
| /media      | 用于挂载设备文件的目录                                    |
| /opt        | 放置第三方的软件                                          |
| /root       | 系统管理员的家目录                                        |
| /srv        | 一些网络服务的数据文件目录                                |
| /tmp        | 任何人均可使用的“共享”临时目录                            |
| /proc       | 虚拟文件系统，例如系统内核、进程、外部设备及网络状态等    |
| /usr/local  | 用户自行安装的软件                                        |
| /usr/sbin   | Linux系统开机时不会使用到的软件/命令/脚本                 |
| /usr/share  | 帮助与说明文件，也可放置共享文件                          |
| /var        | 主要存放经常变化的文件，如日志                            |
| /lost+found | 当文件系统发生错误时，将一些丢失的文件片段存放在这里      |

## 二、帮助命令

想要查看某个命令的帮助信息，可以使用 man 命令。执行 man 命令后，就进入到浏览页面，浏览页面常用按键如下：

| 按键      | 用处                               |
| --------- | ---------------------------------- |
| 空格键    | 向下翻一页                         |
| PaGe down | 向下翻一页                         |
| PaGe up   | 向上翻一页                         |
| home      | 直接前往首页                       |
| end       | 直接前往尾页                       |
| /         | 从上至下搜索某个关键词，如“/linux” |
| ?         | 从下至上搜索某个关键词，如“?linux” |
| n         | 定位到下一个搜索到的关键词         |
| N         | 定位到上一个搜索到的关键词         |
| q         | 退出帮助文档                       |

## 三、Yum相关命令

| 命令                      | 列出所有仓库                 |
| ------------------------- | ---------------------------- |
| yum repolist all          | 列出所有仓库                 |
| yum list all              | 列出仓库中所有软件包         |
| yum info 软件包名称       | 查看软件包信息               |
| yum install 软件包名称    | 安装软件包                   |
| yum reinstall 软件包名称  | 重新安装软件包               |
| yum update 软件包名称     | 升级软件包                   |
| yum remove 软件包名称     | 移除软件包                   |
| yum clean all             | 清除所有仓库缓存             |
| yum check-update          | 检查可更新的软件包           |
| yum grouplist             | 查看系统中已经安装的软件包组 |
| yum groupinstall 软件包组 | 安装指定的软件包组           |
| yum groupremove 软件包组  | 移除指定的软件包组           |
| yum groupinfo 软件包组    | 查询指定的软件包组信息       |

## 四、服务相关命令

服务的启动、重启、停止、重载、查看状态等常用命令如下：

| System V init 命令（RHEL 6系统） | systemctl命令（RHEL 7 系统）  | 作用                           |
| -------------------------------- | ----------------------------- | ------------------------------ |
| service foo start                | systemctl start foo.service   | 启动服务                       |
| service foo restart              | systemctl restart foo.service | 重启服务                       |
| service foo stop                 | systemctl stop foo.service    | 停止服务                       |
| service foo reload               | systemctl reload foo.service  | 重新加载配置文件（不终止服务） |
| service foo status               | systemctl status foo.service  | 查看服务状态                   |

服务开机启动、不启动、查看各级别下服务启动状态等常用命令：

| System V init 命令（RHEL 6系统） | systemctl命令（RHEL 7 系统）             | 作用                               |
| -------------------------------- | ---------------------------------------- | ---------------------------------- |
| chkconfig foo in                 | systemctl enable foo.service             | 开机自动启动                       |
| chkconfig foo off                | systemctl disable foo.service            | 开机不自动启动                     |
| chkconfig foo                    | systemctl is-enable foo.service          | 查看特定服务是否为开启自动启动     |
| chkconfig --list                 | systemctl list-unit-files --type=service | 查看各个级别下服务的启动与禁用情况 |


## 五、常用系统命令

### 1. echo

echo 命令用于在终端输出字符串或变量提取后的值，格式为：echo [字符串 | $变量] 。

```shell
[root@hadoop001 ~]# echo hello
hello
[root@hadoop001 ~]# echo $JAVA_HOME
/usr/java/jdk1.8.0_201
```

### 2. date

date 命令用于显示及设置系统的时间或日期。常用参数如下：

| 参数 | 作用           |
| ---- | -------------- |
| %t   | 跳格[Tab键]    |
| %H   | 小时（00～23） |
| %I   | 小时（00～12） |
| %M   | 分钟（00～59） |
| %S   | 秒（00～59）   |
| %j   | 今年中的第几天 |

按照默认格式查看当前时间：

```shell
[root@hadoop001 ~]# date
2019年 07月 02日 星期二 14:07:34 CST
```

按照“年-月-日 小时:分钟:秒”的格式查看当前系统时间的date命令如下所示：

```shell
[root@hadoop001 ~]# date "+%Y-%m-%d %H:%M:%S"
2019-07-02 14:07:52 
```

设置系统时间：

```shell
[root@hadoop001 ~]# date -s "20190702 14:10:10"
2019年 07月 02日 星期二 14:10:10 CST
```

### 3. reboot

reboot 命令用于重启系统，其格式为 reboot。 

### 4. poweroff

poweroff 命令用于关闭系统，其格式为 poweroff。 

### 5. wget

wget 命令用于在终端中下载网络文件，格式为： wget [参数] 下载地址。 常用参数如下：

| 参数 | 作用                                 |
| ---- | ------------------------------------ |
| -b   | 后台下载模式                         |
| -P   | 下载到指定目录                       |
| -t   | 最大尝试次数                         |
| -c   | 断点续传                             |
| -p   | 下载页面内所有资源，包括图片、视频等 |
| -r   | 递归下载                             |

示例下载百度首页的内容到`/usr/baidu`目录下：

```shell
[root@hadoop001 usr]# wget -r -p www.baidu.com -P /usr/baidu
```

### 6. ps

ps 命令用于查看系统中的进程状态，格式为：ps [参数] ，常用参数如下：

| 参数 | 作用                               |
| ---- | ---------------------------------- |
| -a   | 显示所有进程（包括其他用户的进程） |
| -u   | 用户以及其他详细信息               |
| -x   | 显示没有控制终端的进程             |

在 Linux 系统中，有5种常见的进程状态，分别为运行、中断、不可中断、僵死与停止：

- **R (运行)** ：进程正在运行或在运行队列中等待。
- **S (中断)** ：进程处于休眠中，当某个条件形成后或者接收到信号时，则脱离该   状态。
- **D (不可中断)** ：进程不响应系统异步信号，即便用kill命令也不能将其中断。
- **Z (僵死)** ：进程已经终止，但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。
- **T (停止)** ：进程收到停止信号后停止运行。

示例如下：

```shell
[root@hadoop001 usr]# ps -u
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      2688  0.0  0.0 110092   856 tty1     Ss+  13:45   0:00 /sbin/agetty --
root      3679  0.0  0.1 115572  2216 pts/0    Ss   13:52   0:00 -bash
root     12471  0.0  0.1 155360  1888 pts/0    R+   14:17   0:00 ps -u
```

| USER         | PID      | %CPU         | %MEM       | VSZ                      | RSS                        | TTY      | STAT     | START        | TIME              | COMMAND        |
| ------------ | -------- | ------------ | ---------- | ------------------------ | -------------------------- | -------- | -------- | ------------ | ----------------- | -------------- |
| 进程的所有者 | 进程ID号 | 运算器占用率 | 内存占用率 | 虚拟内存使用量(单位是KB) | 占用的固定内存量(单位是KB) | 所在终端 | 进程状态 | 被启动的时间 | 实际使用CPU的时间 | 命令名称与参数 |

### 7. top

top 命令用于动态地监视进程活动与系统负载等信息，其格式为 top。 

```shell
top - 14:21:25 up 35 min,  1 user,  load average: 0.00, 0.02, 0.05
Tasks: 104 total,   1 running, 103 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.5 us,  0.7 sy,  0.0 ni, 98.7 id,  0.0 wa,  0.0 hi,  0.2 si,  0.0 st
KiB Mem :  1882148 total,  1316728 free,   203592 used,   361828 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1497748 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 3680 root      20   0  113444   1776   1344 S   0.3  0.1   0:06.45 bash
13685 root      20   0  161880   2200   1560 R   0.3  0.1   0:00.09 top
    1 root      20   0  193696   6656   4180 S   0.0  0.4   0:03.10 systemd
```

top 命令执行结果的前5行为系统整体的统计信息，其所代表的含义如下：

**第1行**：系统时间、运行时间、登录终端数、系统负载（三个数值分别为1分钟、5分钟、15分钟内的平均值，数值越小意味着负载越低）。

**第2行**：进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。

**第3行**：用户占用资源百分比（us）、系统内核占用资源百分比（sy）、改变过优先级的进程资源百分比（ni）、空闲的资源百分比（id）等。其中数据均为CPU数据并以百分比格式显示，例如 `98.7 id` 意味着有 98.7% 的 CPU 处理器资源处于空闲。

**第4行**：物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。

**第5行**：虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。

### 8. pidof

pidof 命令用于查询某个指定服务进程的 PID 值，格式为：pidof \[参数][服务名称]。 

### 9. kilL

kill 命令用于终止某个指定 PID 的服务进程，格式为：kill \[参数][进程 PID]。 

### 10. killall

killall 命令用于终止某个指定名称的服务所对应的全部进程，格式为：killall \[参数][服务名称]。 



## 六、状态检测命令

### 1. ifconfig

ifconfig 命令用于获取网卡配置与网络状态等信息，格式为：ifconfig \[网络设备][参数]。

### 2. uname

uname 命令用于查看系统内核与系统版本等信息，格式为：uname [-a]。-a 参数用来查看详细信息，主要有内核名称、主机名、内核发行版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统名称等信息。

```shell
[root@hadoop001 ~]# uname -a
Linux hadoop001 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
```

如果要查看当前系统版本的详细信息，可以使用如下命令：

```shell
[root@hadoop001 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
```

### 3. uptime

uptime 用于查看系统的负载信息。显示**当前系统时间**、**系统已运行时间**、**启用终端数量**以及**平均负载值**等信息。平均负载值指的是系统在最近1分钟、5分钟、15分钟内的压力情况。

```shell
[root@hadoop001 ~]# uptime
 14:32:06 up 46 min,  1 user,  load average: 0.00, 0.01, 0.05
```

### 4. free

free 用于显示当前系统中内存的使用量信息，格式为：free [-h]。 执行`free -h`命令后的输出信息如下：

|       | 内存总量 | 已用量 | 可用量 | 进程共享的内存量 | 磁盘缓存的内存量 | 缓存的内存量 |
| ----- | -------- | ------ | ------ | ---------------- | ---------------- | ------------ |
|       | total    | used   | free   | shared           | buffers          | cached       |
| Mem:  | 1.8G     | 198M   | 1.3G   | 8.5M             | 353M             | 1.4G         |
| Swap: | 2.0G     | 0B     | 2.0G   |                  |                  |              |

swap 全称为 swap place，即交换区，当内存不够的时候，被踢出的进程被暂时存储到交换区。当需要这条被踢出的进程的时候，就从交换区重新加载到内存，否则它不会主动交换到真实内存中。

### 5. who

who 用于查看当前登入主机的用户终端信息，格式为：who [参数]。

### 6. last

last 命令用于查看所有系统的登录记录，格式为：last [参数]。 

### 7. history

history 命令用于显示历史执行过的命令，格式为：history [-c]，默认显示最近1000条命令记录。可以使用 `!序号` 的方式来重复执行某条命令。

### 8. sosreport

sosreport 命令用于收集系统配置及架构信息并输出诊断文档。使用时如果找不到该命令，则需要先使用`yum install sos`命令来安装 sos 包。



## 七、目录相关命令

### 1. pwd

显示当前所在的路径信息。

### 2. cd

切换到指定目录，`cd -`命令返回到上一次所处的目录。

### 3. ls

显示当前路径下的文件信息。想要查看文件的详细信息可以使用`ls -l `，也可以简写为`ll`。

## 八、文件编辑命令 

### 1. cat

cat 命令用于查看内容较少的纯文本文件，格式为：cat \[选项][文件]。常用参数为`-n`，代表带行号显示。

### 2. more

more 命令用于查看内容较多的纯文本文件，格式为：more [选项]文件。可以使用空格键或回车键向下翻页。 

### 3.head

head 命令用于查看纯文本文档的前N行，格式为：head \[选项][文件]。 

```shell
head -n 20 hdfs-site.xml
```

### 4. tail

tail 命令用于查看纯文本文档的后N行或持续刷新内容，格式为：tail \[选项][文件]。

```shell
head -n 20 hdfs-site.xml
```

tail 命令可以持续观察一个文件新写入的内容，此时命令为：tail -f 文件名。 

### 5. stat

stat 命令用于查看文件的具体存储信息和时间等信息，示例如下：

```shell
[root@hadoop001 hadoop]# stat hdfs-site.xml
  文件："hdfs-site.xml"
  大小：1021            块：8          IO 块：4096   普通文件
设备：fd00h/64768d      Inode：3305180     硬链接：1
权限：(0644/-rw-r--r--)  Uid：( 1106/ UNKNOWN)   Gid：( 4001/ UNKNOWN)
环境：unconfined_u:object_r:usr_t:s0
最近访问：2019-07-02 14:50:22.700674460 +0800
最近更改：2019-04-30 16:06:24.421716553 +0800
最近改动：2019-04-30 16:06:24.423716557 +0800
创建时间：-
```

### 6. diff

diff 命令用于比较多个文本文件的差异，格式为：diff [参数] 文件。 常用参数如下：

- 使用`-c`参数来详细比较出多个文件的差异之处 ；
- 使用`--brief`参数来确认两个文件是否不同。

```shell
diff -c diff_A.txt diff_B.txt
diff --brief diff_A.txt diff_B.txt
```

## 九、文件管理命令

### 1. touch

touch 命令用于创建空白文件或设置文件的时间，格式为：touch \[选项][文件]。常用参数如下：

| 参数 | 作用                    |
| ---- | ----------------------- |
| -a   | 仅修改读取时间（atime） |
| -m   | 仅修改修改时间（mtime） |
| -d   | 同时修改atime与mtime    |

```shell
[root@hadoop001 hadoop]# touch -d "2018-08-08 08:08" hdfs-site.xml
```

### 2. mkdir

mkdir 命令用于创建空白的目录，格式为：mkdir [选项] 目录。常用参数为`-p`，代表递归创建：

```shell
mkdir -p a/b/c/d/e
```

### 3. cp

cp 命令用于复制文件或目录，格式为：`cp [选项] 源文件 目标文件`。 常用参数如下：

| 参数 | 作用                                         |
| ---- | -------------------------------------------- |
| -p   | 保留原始文件的属性                           |
| -d   | 若对象为“链接文件”，则保留该“链接文件”的属性 |
| -r   | 递归持续复制（用于目录）                     |
| -i   | 若目标文件存在则询问是否覆盖                 |
| -a   | 相当于 -pdr（p、d、r为上述参数）             |

### 4. mv

mv 命令用于剪切文件或将文件重命名，格式为：`mv [选项] 源文件 [目标路径|目标文件名]`。 如果在同一个目录中对一个文件进行剪切操作，等价于对其进行重命名： 

```shell
 mv yarn-site.xml hello.xml
```

### 5. rm

rm 命令用于删除文件或目录，格式为：rm [选项] 文件。 常用参数如下：

- `-f`：参数来强制删除； 
- `-r` ：参数递归删除文件夹。

### 6. file

file 命令用于查看文件的类型，格式为：file 文件名。 

```shell
[root@hadoop001 hadoop]# file yarn-site.xml
yarn-site.xml: XML 1.0 document, UTF-8 Unicode text
```



## 十、压缩与搜索命令

### 1. tar

tar 命令用于对文件进行压缩或解压，格式为：tar \[选项] [文件]。 常用参数如下：

| 参数 | 作用                   |
| ---- | ---------------------- |
| -c   | 创建压缩文件           |
| -x   | 解开压缩文件           |
| -t   | 查看压缩包内有哪些文件 |
| -z   | 用Gzip压缩或解压       |
| -j   | 用bzip2压缩或解压      |
| -v   | 显示压缩或解压的过程   |
| -f   | 目标文件名             |
| -p   | 保留原始的权限与属性   |
| -P   | 使用绝对路径来压缩     |
| -C   | 指定解压到的目录       |

常用打包命令：`tar -czvf 压缩包名称.tar.gz 要打包的目录`；

常用解压命令：`tar -xzvf 压缩包名称.tar.gz`。 

### 2. grep

grep 命令用于执行关键词搜索，并显示匹配的结果，格式为：grep \[选项][文件]。 常用参数如下：

| 参数 | 作用                                             |
| ---- | ------------------------------------------------ |
| -b   | 将可执行文件（binary）当作文本文件（text）来搜索 |
| -c   | 仅显示找到的行数                                 |
| -i   | 忽略大小写                                       |
| -n   | 显示行号                                         |
| -v   | 反向选择——仅列出没有关键词的行。                 |

```shell
[root@hadoop001 hadoop]# cat core-site.xml | grep hadoop -n
22:    <value>hdfs://hadoop001:8020</value>
25:    <name>hadoop.proxyuser.root.hosts</name>
29:    <name>hadoop.proxyuser.root.groups</name>
```

### 3. find

find 命令用于按照指定条件来查找文件，格式为：`find [查找路径] 寻找条件 操作`。 常用命令如下：

| 参数               | 作用                                                         |
| ------------------ | ------------------------------------------------------------ |
| -name              | 匹配名称                                                     |
| -perm              | 匹配权限（mode为完全匹配，-mode为包含即可）                  |
| -user              | 匹配所有者                                                   |
| -group             | 匹配所有组                                                   |
| -mtime -n +n       | 匹配修改内容的时间（-n指n天以内，+n指n天以前）               |
| -atime -n +n       | 匹配访问文件的时间（-n指n天以内，+n指n天以前）               |
| -ctime -n +n       | 匹配修改文件权限的时间（-n指n天以内，+n指n天以前）           |
| -nouser            | 匹配无所有者的文件                                           |
| -nogroup           | 匹配无所有组的文件                                           |
| -newer f1 !f2      | 匹配比文件f1新但比f2旧的文件                                 |
| --type b/d/c/p/l/f | 匹配文件类型（后面的字幕字母依次表示块设备、目录、字符设备、管道、链接文件、文本文件） |
| -size              | 匹配文件的大小（+50KB为查找超过50KB的文件，而-50KB为查找小于50KB的文件） |
| -prune             | 忽略某个目录                                                 |
| -exec …… {}\;      | 后面可跟用于进一步处理搜索结果的命令                         |

获取到指定目录中所有以 host 开头的文件列表，可以执行如下命令： 

```shell
find /etc -name "host*" -print
```



## 十一、用户管理相关命令

### 1. useradd

useradd 命令用于创建新的用户，格式为：useradd [选项] 用户名。使用该命令创建用户账户时，默认的用户家目录会被存放在`/home`目录中，默认的 Shell 解释器为`/bin/bash`，默认会创建一个与该用户同名的基本用户组。常用配置如下：

| 参数 | 作用                                     |
| ---- | ---------------------------------------- |
| -d   | 指定用户的家目录（默认为/home/username） |
| -e   | 账户的到期时间，格式为YYYY-MM-DD.        |
| -u   | 指定该用户的默认UID                      |
| -g   | 指定一个初始的用户基本组（必须已存在）   |
| -G   | 指定一个或多个扩展用户组                 |
| -N   | 不创建与用户同名的基本用户组             |
| -s   | 指定该用户的默认 Shell 解释器            |

```shell
[root@hadoop001 ~]# id heibaiying
uid=1000(heibaiying) gid=1000(heibaiying) 组=1000(heibaiying)
```

UID就相当是用户的唯一标识，其赋值规则如下：

- 管理员 UID 为0：系统的管理员用户。
- 系统用户 UID 为1～999： Linux 系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器，默认服务程序会有独立的系统用户负责运行，进而有效控制被破坏范围。
- 普通用户 UID 从1000 开始：是由管理员创建的用于日常工作的用户。

### 2. groupadd

groupadd 命令用于创建用户组，格式为：groupadd [选项] 群组名。 

### 3. usermod

创建后用户的信息保存在`/etc/passwd`文件中，可以直接对其进行编辑来修改用户参数，或使用 usermod 命令。常用参数如下：

| 参数  | 作用                                                         |
| ----- | ------------------------------------------------------------ |
| -c    | 填写用户账户的备注信息                                       |
| -d -m | 参数-m与参数-d连用，可重新指定用户的家目录并自动把旧的数据转移过去 |
| -e    | 账户的到期时间，格式为YYYY-MM-DD                             |
| -g    | 变更所属用户组                                               |
| -G    | 变更扩展用户组                                               |
| -L    | 锁定用户禁止其登录系统                                       |
| -U    | 解锁用户，允许其登录系统                                     |
| -s    | 变更默认终端                                                 |
| -u    | 修改用户的UID                                                |

```shell
[root@hadoop001 ~]# usermod -u 9999 heibaiying
[root@hadoop001 ~]# id heibaiying
uid=9999(heibaiying) gid=1000(heibaiying) 组=1000(heibaiying)
```

### 4. passwd

passwd 命令用于设置或修改用户密码、过期时间、认证信息等，格式为：passwd \[选项][用户名]。常用参数如下：

| 参数    | 作用                                                         |
| ------- | ------------------------------------------------------------ |
| -l      | 锁定用户，禁止其登录                                         |
| -u      | 解除锁定，允许用户登录                                       |
| --stdin | 允许通过标准输入修改用户密码，如echo "NewPassWord" \| passwd --stdin Username |
| -d      | 使该用户可用空密码登录系统                                   |
| -e      | 强制用户在下次登录时修改密码                                 |
| -S      | 显示用户的密码是否被锁定，以及密码所采用的加密算法名称       |

```shell
[root@hadoop001 ~]# passwd
更改用户 root 的密码 。
新的 密码：
重新输入新的 密码：
passwd：所有的身份验证令牌已经成功更新。
```

### 5. userdel

userdel 命令用于删除用户，格式为：userdel [选项] 用户名。常用参数如下：

| 参数 | 作用                     |
| ---- | ------------------------ |
| -f   | 强制删除用户             |
| -r   | 同时删除用户及用户家目录 |

## 十二、文件权限相关命令

使用 `ll` 命令可以查看到文件的详细属性，各个属性的含义如下：

<div align="center"> <img src="../pictures/文件属性信息.png"/> </div>

文件类型可以分为以下几类：

- \-：普通文件。
- d：目录文件。
- l：链接文件。
- b：块设备文件。
- c：字符设备文件。
- p：管道文件。

### 1. chmod

chmod 用于设置文件或目录的权限，格式为：chmod [参数] 权限 文件或目录名称。 权限支持字符表示和数字表示两种形式，其对应关系如下：

<div align="center"> <img src="../pictures/文件权限的字符与数字表示.png"/> </div>
示例如下：

```
[root@hadoop001 ~]# ll test.txt
-rw-r--r--. 1 root root 0 7月   3 14:49 test.txt
[root@hadoop001 ~]# chmod 760  test.txt
[root@hadoop001 ~]# ll test.txt
-rwxrw----. 1 root root 0 7月   3 14:49 test.txt
```

### 2. chown

chown 设置文件或目录的所有者和所属组，格式为：chown [参数] 所有者:所属组 文件或目录名称。

```shell
[root@hadoop001 ~]# stat test.txt
......
权限：(0760/-rwxrw----)  Uid：(    0/    root)   Gid：(    0/    root)
......
[root@hadoop001 ~]# chown  heibaiying:heibaiying test.txt
[root@hadoop001 ~]# stat test.txt
......
权限：(0760/-rwxrw----)  Uid：( 9999/heibaiying)   Gid：( 1000/heibaiying)
......
```


### 3. 软硬链接

**硬链接（hard link）**：可以将它理解为一个“指向原始文件 inode 的指针”，系统不为它分配独立的 inode 和文件。所以，硬链接文件与原始文件其实是同一个文件，只是名字不同。我们每添加一个硬链接，该文件的 inode 连接数就会增加 1；而且只有当该文件的 inode 连接数为 0 时，才算彻底将它删除。换言之，由于硬链接实际上是指向原文件 inode 的指针，因此即便原始文件被删除，依然可以通过硬链接文件来访问。

**软链接（也称为符号链接）**：仅仅包含所链接文件的路径名，因此能链接目录文件，也可以跨越文件系统进行链接。但是，当原始文件被删除后，链接文件也将失效，与 Windows 系统中的快捷方式类似。

ln 命令用于创建链接文件，格式为：ln [选项]  目标。常用参数如下：

| 参数 | 作用                                             |
| ---- | ------------------------------------------------ |
| -s   | 创建符号链接（如果不带-s参数，则默认创建硬链接） |
| -f   | 强制创建文件或目录的链接                         |
| -i   | 覆盖前先询问                                     |
| -v   | 显示创建链接的过程                               |

## 十三、Vim编辑器常用命令

Vim编辑器有三种状态模式：

- 命令模式：控制光标移动，可对文本进行复制、粘贴、删除和查找等工作。
- 输入模式：正常的文本录入。
- 末行模式：保存或退出文档，以及设置编辑环境。

<div align="center"> <img src="../pictures/vim不同模式间的切换.png"/> </div>
命令模式中常用的命令如下：

| 命令 | 作用                                               |
| ---- | -------------------------------------------------- |
| dd   | 删除（剪切）光标所在整行                           |
| 5dd  | 删除（剪切）从光标处开始的5行                      |
| yy   | 复制光标所在整行                                   |
| 5yy  | 复制从光标处开始的5行                              |
| n    | 显示搜索命令定位到的下一个字符串                   |
| N    | 显示搜索命令定位到的上一个字符串                   |
| u    | 撤销上一步的操作                                   |
| p    | 将之前删除（dd）或复制（yy）过的数据粘贴到光标后面 |

末行模式中可用的命令如下：

| 命令          | 作用                                    |
| ------------- | --------------------------------------- |
| :w            | 保存                                    |
| :q            | 退出                                    |
| :q!           | 强制退出（放弃对文档的修改内容）        |
| :wq!          | 强制保存退出                            |
| :set nu       | 显示行号                                |
| :set nonu     | 不显示行号                              |
| :命令         | 执行该命令                              |
| :整数         | 跳转到该行                              |
| :s/one/two    | 将当前光标所在行的第一个 one 替换成 two |
| :s/one/two/g  | 将当前光标所在行的所有 one 替换成 two   |
| :%s/one/two/g | 将全文中的所有 one 替换成 two           |
| ?字符串       | 在文本中从下至上搜索该字符串            |
| /字符串       | 在文本中从上至下搜索该字符串            |

使用 a、 i、 o 三个键从命令模式切换到输入模式。其中， `a` 键与 `i` 键分别是在光标后面一位和光标当前位置切换到输入模式，而 `o`  键则是在光标的下面再创建一个空行，此时可敲击 `a` 键进入到输入模式。

## 十四、输入输出重定向

输入重定向是指把文件导入到命令中，而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。同时输出重定向又分为标准输出重定向和错误输出重定向。

- 标准输入重定向（STDIN，文件描述符为0）：默认从键盘输入，也可从其他文件或命令中输入。
- 标准输出重定向（STDOUT，文件描述符为1）：默认输出到屏幕。
- 错误输出重定向（STDERR，文件描述符为2）：默认输出到屏幕。

输入重定向中用到的符号及其作用如下：

| 符号                 | 作用                                         |
| -------------------- | -------------------------------------------- |
| 命令 < 文件          | 将文件作为命令的标准输入                     |
| 命令 << 分界符       | 从标准输入中读入，直到遇见分界符才停止       |
| 命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |

输出重定向中用到的符号及其作用如下：

| 符号                                  | 作用                                                         |
| ------------------------------------- | ------------------------------------------------------------ |
| 命令 > 文件                           | 将标准输出重定向到一个文件中（清空原有文件的数据）           |
| 命令 2> 文件                          | 将错误输出重定向到一个文件中（清空原有文件的数据）           |
| 命令 >> 文件                          | 将标准输出重定向到一个文件中（追加到原有内容的后面）         |
| 命令 2>> 文件                         | 将错误输出重定向到一个文件中（追加到原有内容的后面）         |
| 命令 >> 文件 2>&1   或  命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中（追加到原有内容的后面） |



## 参考资料

[《Linux 就该这么学》刘遄](https://www.linuxprobe.com/chapter-00.html)
