# Linux 文件与目录管理

#### 博客作者：联系请[点击](https://hezhiqiang.gitbook.io/about-the-author/lian-xi-zuo-zhe)，搬运不易，希望请作者喝咖啡，可以点击[联系博客作者](https://hezhiqiang.gitbook.io/about-the-author/lian-xi-zuo-zhe)

## 前言

1. Linux的目录结构为树状结构，最顶级的目录为根目录 `/`。
2. 其他目录通过挂载可以将它们添加到树中，通过解除挂载可以移除它们。

### 绝对路径与相对路径说明:

{% hint style="info" %}

* **绝对路径：**\
  路径的写法，由根目录 / 写起，例如： /usr/share/doc 这个目录。
* **相对路径：**\
  路径的写法，不是由 / 写起，例如由 /usr/share/doc 要到 /usr/share/man 底下时，可以写成： cd ../man 这就是相对路径的写法。
  {% endhint %}

## 一、目录常用命令

### 常见处理目录的命令：

* ls（英文全拼：list files）: 列出目录及文件名
* cd（英文全拼：change directory）：切换目录
* pwd（英文全拼：print work directory）：显示目前的目录
* mkdir（英文全拼：make directory）：创建一个新的目录
* rmdir（英文全拼：remove directory）：删除一个空的目录
* cp（英文全拼：copy file）: 复制文件或目录
* rm（英文全拼：remove）: 删除文件或目录
* mv（英文全拼：move file）: 移动文件与目录，或修改文件与目录的名称

可以使用 man \[命令] 来查看各个命令的使用文档，如 ：`man cp`。

### ls (列出目录)

在Linux系统当中， ls 命令可能是最常被运行的。

语法：

```
[root@hezhiqiang ~]# ls [-aAdfFhilnrRSt] 目录名称
[root@hezhiqiang ~]# ls [--color={never,auto,always}] 目录名称
[root@hezhiqiang ~]# ls [--full-time] 目录名称
```

选项与参数：

* -a ：全部的文件，连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)
* -d ：仅列出目录本身，而不是列出目录内的文件数据(常用)
* -l ：长数据串列出，包含文件的属性与权限等等数据；(常用)

将家目录下的所有文件列出来(含属性与隐藏档)

```
[root@hezhiqiang ~]# ls -al ~
```

### cd (切换目录)

cd是Change Directory的缩写，这是用来变换工作目录的命令。

语法：

```
 cd [相对路径或绝对路径]
```

```
#使用 mkdir 命令创建 runoob 目录
[root@hezhiqiang ~]# mkdir runoob

#使用绝对路径切换到 runoob 目录
[root@hezhiqiang ~]# cd /root/runoob/

#使用相对路径切换到 runoob 目录
[root@hezhiqiang ~]# cd ./runoob/

# 表示回到自己的家目录，亦即是 /root 这个目录
[root@hezhiqiang runoob]# cd ~

# 表示去到目前的上一级目录，亦即是 /root 的上一级目录的意思；
[root@hezhiqiang ~]# cd ..
```

接下来大家多操作几次应该就可以很好的理解 cd 命令的。

### pwd (显示目前所在的目录)

pwd 是 **Print Working Directory** 的缩写，也就是显示目前所在目录的命令。

```
[root@hezhiqiang ~]# pwd [-P]
```

选项与参数：

* -P ：显示出确实的路径，而非使用连结 (link) 路径。

实例：单纯显示出目前的工作目录：

```
[root@hezhiqiang ~]# pwd
/root   <== 显示出目录啦～
```

实例显示出实际的工作目录，而非连结档本身的目录名而已。

```
[root@hezhiqiang ~]# cd /var/mail   <==注意，/var/mail是一个连结档
[root@hezhiqiang mail]# pwd
/var/mail         <==列出目前的工作目录
[root@hezhiqiang mail]# pwd -P
/var/spool/mail   <==怎么回事？有没有加 -P 差很多～
[root@hezhiqiang mail]# ls -ld /var/mail
lrwxrwxrwx 1 root root 10 Sep  4 17:54 /var/mail -> spool/mail
# 看到这里应该知道为啥了吧？因为 /var/mail 是连结档，连结到 /var/spool/mail 
# 所以，加上 pwd -P 的选项后，会不以连结档的数据显示，而是显示正确的完整路径啊！
```

### mkdir (创建新目录)

如果想要创建新的目录的话，那么就使用mkdir (make directory)吧。

语法：

```
mkdir [-mp] 目录名称
```

选项与参数：

* -m ：配置文件的权限喔！直接配置，不需要看默认权限 (umask) 的脸色～
* -p ：帮助你直接将所需要的目录(包含上一级目录)递归创建起来！

实例：请到/tmp底下尝试创建数个新目录看看：

```
[root@hezhiqiang ~]# cd /tmp
[root@hezhiqiang tmp]# mkdir test    <==创建一名为 test 的新目录
[root@hezhiqiang tmp]# mkdir test1/test2/test3/test4
mkdir: cannot create directory `test1/test2/test3/test4': 
No such file or directory       <== 没办法直接创建此目录啊！
[root@hezhiqiang tmp]# mkdir -p test1/test2/test3/test4
```

加了这个 -p 的选项，可以自行帮你创建多层目录！

实例：创建权限为 **rwx--x--x** 的目录。

```
[root@hezhiqiang tmp]# mkdir -m 711 test2
[root@hezhiqiang tmp]# ls -l
drwxr-xr-x  3 root  root 4096 Jul 18 12:50 test
drwxr-xr-x  3 root  root 4096 Jul 18 12:53 test1
drwx--x--x  2 root  root 4096 Jul 18 12:54 test2
```

上面的权限部分，如果没有加上 -m 来强制配置属性，系统会使用默认属性。

如果我们使用 -m ，如上例我们给予 -m 711 来给予新的目录 drwx--x--x 的权限。

### rmdir (删除空的目录)

语法：

```
 rmdir [-p] 目录名称
```

选项与参数：

* **-p ：**&#x8FDE;同上一级『空的』目录也一起删除

删除 runoob 目录

```
[root@hezhiqiang tmp]# rmdir runoob/
```

将 mkdir 实例中创建的目录(/tmp 底下)删除掉！

```
[root@hezhiqiang tmp]# ls -l   <==看看有多少目录存在？
drwxr-xr-x  3 root  root 4096 Jul 18 12:50 test
drwxr-xr-x  3 root  root 4096 Jul 18 12:53 test1
drwx--x--x  2 root  root 4096 Jul 18 12:54 test2
[root@hezhiqiang tmp]# rmdir test   <==可直接删除掉，没问题
[root@hezhiqiang tmp]# rmdir test1  <==因为尚有内容，所以无法删除！
rmdir: `test1': Directory not empty
[root@hezhiqiang tmp]# rmdir -p test1/test2/test3/test4
[root@hezhiqiang tmp]# ls -l        <==您看看，底下的输出中test与test1不见了！
drwx--x--x  2 root  root 4096 Jul 18 12:54 test2
```

利用 -p 这个选项，立刻就可以将 test1/test2/test3/test4 一次删除。

不过要注意的是，这个 rmdir 仅能删除空的目录，你可以使用 rm 命令来删除非空目录。

### cp (复制文件或目录)

cp 即拷贝文件和目录。

语法:

```
[root@hezhiqiang ~]# cp [-adfilprsu] 来源档(source) 目标档(destination)
[root@hezhiqiang ~]# cp [options] source1 source2 source3 .... directory
```

选项与参数：

* **-a：**&#x76F8;当於 -pdr 的意思，至於 pdr 请参考下列说明；(常用)
* **-d：**&#x82E5;来源档为连结档的属性(link file)，则复制连结档属性而非文件本身；
* **-f：**&#x4E3A;强制(force)的意思，若目标文件已经存在且无法开启，则移除后再尝试一次；
* **-i：**&#x82E5;目标档(destination)已经存在时，在覆盖时会先询问动作的进行(常用)
* **-l：**&#x8FDB;行硬式连结(hard link)的连结档创建，而非复制文件本身；
* **-p：**&#x8FDE;同文件的属性一起复制过去，而非使用默认属性(备份常用)；
* **-r：**&#x9012;归持续复制，用於目录的复制行为；(常用)
* **-s：**&#x590D;制成为符号连结档 (symbolic link)，亦即『捷径』文件；
* **-u：**&#x82E5; destination 比 source 旧才升级 destination ！

用 root 身份，将 root 目录下的 .bashrc 复制到 /tmp 下，并命名为 bashrc

```
[root@hezhiqiang ~]# cp ~/.bashrc /tmp/bashrc
[root@hezhiqiang ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n  <==n不覆盖，y为覆盖
```

### rm (移除文件或目录)

语法：

```
 rm [-fir] 文件或目录
```

选项与参数：

* -f ：就是 force 的意思，忽略不存在的文件，不会出现警告信息；
* -i ：互动模式，在删除前会询问使用者是否动作
* -r ：递归删除,最常用在目录的删除,非常危险的选项.

将刚刚在 cp 的实例中创建的 bashrc 删除掉！

```
[root@hezhiqiang tmp]# rm -i bashrc
rm: remove regular file `bashrc'? y
```

如果加上 -i 的选项就会主动询问，避免您删除到错误的档名！

### mv (移动文件与目录，或修改名称)

语法：

```
[root@hezhiqiang ~]# mv [-fiu] source destination
[root@hezhiqiang ~]# mv [options] source1 source2 source3 .... directory
```

选项与参数：

* -f ：force 强制的意思，如果目标文件已经存在，不会询问而直接覆盖；
* -i ：若目标文件 (destination) 已经存在时，就会询问是否覆盖！
* -u ：若目标文件已经存在，且 source 比较新，才会升级 (update)

复制一文件，创建一目录，将文件移动到目录中

```
[root@hezhiqiang ~]# cd /tmp
[root@hezhiqiang tmp]# cp ~/.bashrc bashrc
[root@hezhiqiang tmp]# mkdir mvtest
[root@hezhiqiang tmp]# mv bashrc mvtest
```

将某个文件移动到某个目录去，就是这样做！

将刚刚的目录名称更名为 mvtest2

```
[root@hezhiqiang tmp]# mv mvtest mvtest2
```

## 二、Linux 文件基本属性

Linux 系统是一种典型的多用户系统，不同的用户处于不同的地位，拥有不同的权限。

为了保护系统的安全性，Linux 系统对不同的用户访问同一文件（包括目录文件）的权限做了不同的规定。

在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限：

* chown (change owner) ： 修改所属用户与组。
* chmod (change mode) ： 修改用户的权限。

下图中通过 chown 来授权用户，通过 chmod 为用户设置可以开门的权限。

![](https://www.runoob.com/wp-content/uploads/2014/06/1_151733904241.png)

在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组。

如：

```
[root@hezhiqiang /]# ls -l
total 64
dr-xr-xr-x   2 root root 4096 Dec 14  2012 bin
dr-xr-xr-x   4 root root 4096 Apr 19  2012 boot
……
```

示例中，**bin** 文件的第一个属性用 d 表示。d 在 Linux 中代表该文件是一个目录文件。

在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。

* 当为 d 则是目录
* 当为 - 则是文件；
* 若是 l 则表示为链接文档(link file)；
* 若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置)；
* 若是 c 则表示为装置文件里面的串行端口设备，例如键盘、鼠标(一次性读取装置)。

接下来的字符中，以三个为一组，且均为 rwx 的三个参数的组合。其中， `r` 代表可读(read)、 `w` 代表可写(write)、 `x` 代表可执行(execute)。 要注意的是，这三个权限的位置不会改变，如果没有权限，就会出现减号 `-` 而已。

<figure><img src="/files/oQvxhdOCYAgefdARmpjh" alt=""><figcaption></figcaption></figure>

每个文件的属性由左边第一部分的 10 个字符来确定（如下图）。

<figure><img src="https://www.runoob.com/wp-content/uploads/2014/06/363003_1227493859FdXT.png" alt=""><figcaption></figcaption></figure>

从左至右用 **0-9** 这些数字来表示。

* 第 **0** 位确定文件类型，第 **1-3** 位确定属主（该文件的所有者）拥有该文件的权限。
* 第4-6位确定属组（所有者的同组用户）拥有该文件的权限，第7-9位确定其他用户拥有该文件的权限。
* 第 **1、4、7** 位表示读权限，如果用 `r` 字符表示，则有读权限，如果用 `-` 字符表示，则没有读权限；
* 第 **2、5、8** 位表示写权限，如果用 `w` 字符表示，则有写权限，如果用 `-` 字符表示没有写权限；
* 第 **3、6、9** 位表示可执行权限，如果用 `x` 字符表示，则有执行权限，如果用 `-` 字符表示，则没有执行权限。

### chgrp

更改文件属组

语法：

```
chgrp [-R] 属组名 文件名
```

参数选项

* -R：递归更改文件属组，就是在更改某个目录文件的属组时，如果加上-R的参数，那么该目录下的所有文件的属组都会更改。

示例：

<figure><img src="/files/DlkmWEk1yM4cFnYUrNbV" alt=""><figcaption></figcaption></figure>

### chown

更改文件属主，也可以同时更改文件属组

语法：

```
chown [–R] 属主名 文件名
chown [-R] 属主名：属组名 文件名
```

示例：

<figure><img src="/files/piJpfYfag6BSA6Wvhe0P" alt=""><figcaption></figcaption></figure>

### chmod：

更改文件属性

Linux文件属性有两种设置方法，一种是数字，一种是符号。

Linux 文件的基本权限就有九个，分别是 **owner/group/others(拥有者/组/其他)** 三种身份各有自己的 &#x8BFB;**/写/执行** 权限。

文件的权限字符为： -rwxrwxrwx ， 这九个权限是三个三个一组，可以使用数字来代表各个权限，各权限的分数对照表如下：

* r:4
* w:2
* x:1

chmod 的语法：

```
 chmod [-R] xyz 文件或目录
```

选项与参数：

* **xyz** : 就是刚刚提到的数字类型的权限属性，为 **rwx** 属性数值的相加。
* **-R** : 进行递归(recursive)的持续变更，以及连同次目录下的所有文件都会变更

示例：

<figure><img src="/files/C5BjGt626WyqVdtIQSkV" alt=""><figcaption></figcaption></figure>

#### 符号类型改变文件权限

基本上就九个权限分别是：

* user：用户
* group：组
* others：其他

使用 **u, g, o** 来代表三种身份的权限。

示例：

<figure><img src="/files/1d3xvpCmQKvXBW7iebRh" alt=""><figcaption></figcaption></figure>

## 三、Linux 文件隐藏属性

> 管理 Linux 系统中的文件和目录，除了可以设定普通权限和特殊权限外，还可以利用文件和目录具有的一些隐藏属性。

### **chattr**

**专门用来修改文件或目录的隐藏属性，只有 root 用户可以使用。**

#### **语法：**

```
chattr [参数] [+-=] [属性] 文件或目录名
```

#### **选项：**

* -R 递归处理，将指定目录下的所有文件及子目录一并处理。
* -V 显示指令执行过程。
* +<属性> 开启文件或目录的该项属性。
* -<属性> 关闭文件或目录的该项属性。
* \=<属性> 指定文件或目录的该项属性。

#### **属性：**

* a：让文件或目录仅供附加用途。
* b：不更新文件或目录的最后存取时间。
* c：将文件或目录压缩后存放。
* d：将文件或目录排除在倾倒操作之外。
* i：不得任意更动文件或目录。
* s：保密性删除文件或目录。
* S：即时更新文件或目录。
* u：预防意外删除。

#### 示例：

<figure><img src="/files/LyiAYU5dvU0JZk2lSMDe" alt=""><figcaption></figcaption></figure>

### lsattr

命令用于显示文件隐藏属性。

> 用chattr执行改变文件或目录的隐藏属性，可执行lsattr指令查询其隐藏属性。

## 四、Linux 链接概念

Linux 链接分两种，一种被称为硬链接（Hard Link），另一种被称为符号链接（Symbolic Link）。默认情况下，ln 命令产生硬链接。

### **硬连接**

硬连接指通过索引节点来进行连接。在 Linux 的文件系统中，保存在磁盘分区中的文件不管是什么类型都给它分配一个编号，称为索引节点号(Inode Index)。在 Linux 中，多个文件名指向同一索引节点是存在的。比如：A 是 B 的硬链接（A 和 B 都是文件名），则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同，即一个 inode 节点对应两个不同的文件名，两个文件名指向同一个文件，A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。

硬连接的作用是允许一个文件拥有多个有效路径名，这样用户就可以建立硬连接到重要文件，以防止“误删”的功能。其原因如上所述，因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接，只有当最后一个连接被删除后，文件的数据块及目录的连接才会被释放。也就是说，文件真正删除的条件是与之相关的所有硬连接文件均被删除。

### **软连接**

另外一种连接称之为符号连接（Symbolic Link），也叫软连接。软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中，文件实际上是一个文本文件，其中包含的有另一文件的位置信息。比如：A 是 B 的软链接（A 和 B 都是文件名），A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同，A 和 B 指向的是两个不同的 inode，继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名（可以根据这个找到 B 的目录项）。A 和 B 之间是“主从”关系，如果 B 被删除了，A 仍然存在（因为两个是不同的文件），但指向的是一个无效的链接。

**示例：**

```
[oracle@hezhiqiang]$ touch f1          #创建一个测试文件f1
[oracle@hezhiqiang]$ ln f1 f2          #创建f1的一个硬连接文件f2
[oracle@hezhiqiang]$ ln -s f1 f3       #创建f1的一个符号连接文件f3
[oracle@hezhiqiang]$ ls -li            # -i参数显示文件的inode节点信息
total 0
9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f1
9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f2
9797649 lrwxrwxrwx  1 oracle oinstall 2 Apr 21 08:11 f3 -> f1
```

从上面的结果中可以看出，硬连接文件 f2 与原文件 f1 的 inode 节点相同，均为 9797648，然而符号连接文件的 inode 节点不同。

```
[oracle@hezhiqiang]$ echo "I am f1 file" >>f1
[oracle@hezhiqiang]$ cat f1
I am f1 file
[oracle@hezhiqiang]$ cat f2
I am f1 file
[oracle@hezhiqiang]$ cat f3
I am f1 file
[oracle@hezhiqiang]$ rm -f f1
[oracle@hezhiqiang]$ cat f2
I am f1 file
[oracle@hezhiqiang]$ cat f3
cat: f3: No such file or directory
```

通过上面的测试可以看出：当删除原始文件 f1 后，硬连接 f2 不受影响，但是符号连接 f1 文件无效

#### 总结

依此您可以做一些相关的测试，可以得到以下全部结论：

* 删除符号连接f3,对f1,f2无影响；
* 删除硬连接f2，对f1,f3也无影响；
* 删除原文件f1，对硬连接f2没有影响，导致符号连接f3失效；
* 同时删除原文件f1,硬连接f2，整个文件会真正的被删除。

## 五、Linux 文件内容查看

Linux系统中使用以下命令来查看文件的内容：

* cat  由第一行开始显示文件内容
* tac  从最后一行开始显示，可以看出 tac 是 cat 的倒着写！
* nl   显示的时候，顺道输出行号！
* more 一页一页的显示文件内容
* less 与 more 类似，但是比 more 更好的是，他可以往前翻页！
* head 只看头几行
* tail 只看尾巴几行

你可以使用 man \[命令]来查看各个命令的使用文档，如 ：man cp。

### cat

由第一行开始显示文件内容

#### 语法：

```
cat [选项] [参数]
```

#### 选项：

* -A ：相当於 -vET 的整合选项，可列出一些特殊字符而不是空白而已；
* -b ：列出行号，仅针对非空白行做行号显示，空白行不标行号！
* -E ：将结尾的断行字节 $ 显示出来；
* -n ：列印出行号，连同空白行也会有行号，与 -b 的选项不同；
* -T ：将 \[tab] 按键以 ^I 显示出来；
* -v ：列出一些看不出来的特殊字符

#### 参数

文件列表：指定要保存内容的文件列表。

#### 示例：

检看 /etc/issue 这个文件的内容：

```
[root@hezhiqiang ~]# cat /etc/issue
CentOS release 6.4 (Final)
Kernel \r on an \m
```

### tac

tac与cat命令刚好相反，文件内容从最后一行开始显示，可以看出 tac 是 cat 的倒着写

**tac命令**用于将文件已行为单位的反序输出，即第一行最后显示，最后一行先显示。

#### 语法

```
tac [选项] [参数]
```

#### 选项

```
-a或——append：将内容追加到文件的末尾；
-i或——ignore-interrupts：忽略中断信号。
```

#### 参数

文件列表：指定要保存内容的文件列表。

**示例：**

```

[root@hezhiqiang ~]# tac /etc/issue
Kernel \r on an \m
CentOS release 6.4 (Final)
```

### nl

#### 显示行号

#### 语法：

```
nl [选项] [参数]
```

#### 选项：

* -b ：指定行号指定的方式，主要有两种：\
  -b a ：表示不论是否为空行，也同样列出行号(类似 cat -n)；\
  -b t ：如果有空行，空的那一行不要列出行号(默认值)；
* -n ：列出行号表示的方法，主要有三种：\
  -n ln ：行号在荧幕的最左方显示；\
  -n rn ：行号在自己栏位的最右方显示，且不加 0 ；\
  -n rz ：行号在自己栏位的最右方显示，且加 0 ；
* -w ：行号栏位的占用的位数。

#### **示例：**

用 nl 列出 /etc/issue 的内容

```
[root@hezhiqiang ~]# nl /etc/issue
     1  CentOS release 6.4 (Final)
     2  Kernel \r on an \m
```

### more

**more命令**是一个基于[vi](http://man.linuxde.net/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字符显示为指定个数的空格字符。
```

#### 参数

文件：指定要分屏显示内容的文件。

**示例：**

一页一页翻动，以下实例输出/etc/man.config文件的内容：

```
[root@hezhiqiang ~]# less /etc/man.config
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.6d
....(中间省略)....
:   <== 这里可以等待你输入命令！
```

less运行时可以输入的命令有：

* 空白键    ：向下翻动一页；
* \[pagedown]：向下翻动一页；
* \[pageup]  ：向上翻动一页；
* /字串     ：向下搜寻『字串』的功能；
* ?字串     ：向上搜寻『字串』的功能；
* n         ：重复前一个搜寻 (与 / 或 ? 有关！)
* N        ：反向的重复前一个搜寻 (与 / 或 ? 有关！)
* q         ：离开 less 这个程序；

### head

**head命令**用于显示文件的开头的内容。在默认情况下，head命令显示文件的头10行内容。

#### 语法

```
head [选项] [参数]
```

#### 选项

```
-n<数字>：指定显示头部内容的行数；
-c<字符数>：指定显示头部内容的字符数；
-v：总是显示文件名的头信息；
-q：不显示文件名的头信息。
```

#### 参数

文件列表：指定显示头部内容的文件列表。

**示例：**

默认的情况中，显示前面 10 行

```
[root@hezhiqiang ~]# head /etc/man.config
```

显示前 20 行，就得要这样：

```
[root@hezhiqiang ~]# head -n 20 /etc/man.config
```

### tail

**tail命令**用于输入文件中的尾部内容。tail命令默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个，则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为“-”，则读取标准输入。

{% hint style="danger" %}
**注意**：如果表示字节或行数的N值之前有一个”+”号，则从文件开头的第N项开始显示，而不是显示文件的最后N项。N值后面可以有后缀：b表示512，k表示1024，m表示1048576(1M)。
{% endhint %}

#### 语法

```
tail [选项] [参数]
```

#### 选项

* -n ：后面接数字，代表显示几行的意思
* -f ：表示持续侦测后面所接的档名，要等到按下\[ctrl]-c才会结束tail的侦测

#### 参数

文件列表：指定要显示尾部内容的文件列表。

**示例：**

```
tail file （显示文件file的最后10行）
tail +20 file （显示文件file的内容，从第20行至文件末尾）
tail -c 10 file （显示文件file的最后10个字符）
```

## 六、Linux文件内容对比

> Linux文件对比用来比较两个文件内容的差别，主要有comm命令和diff命令，如果想对两个有序的文件进行比较，可以使用comm命令。如果要逐行比较两个文本文件，列出其不同之处可以使用diff命令。

### comm

该命令是对两个已经排好序的文件进行比较。其中file1和file2是已排序的文件。comm读取这两个文件，然后生成三列输出：仅在file1中出现的行；仅在file2中出现的行；在两个文件中都存在的行。如果文件名用“- ”，则表示从标准输入读取。

语法：

```
comm [- 123 ] file1 file2
```

* comm -1 不显示只出现在第一个文件的行。
* comm -2 不显示只出现在第二个文件的行。
* comm -3 不显示同时出现在两个文件的行。

<figure><img src="/files/mSgUIkrXFwDpkEggVC8Q" alt=""><figcaption></figcaption></figure>

comm file1 file2 显示三列，

* 第一列代表只出现在file1的行，
* 第二列代表只出现在file2的行，
* 第三列代表俩个文件同时出现的行
* comm -12 显示两个文件同时出现的行 也就是交集
* comm -13 显示只出现在第二个文件的行
* comm -23 显示只出现在第一个文件的行

<figure><img src="/files/dw6UXf0JpeWR78GQdiAG" alt=""><figcaption></figcaption></figure>

### diff

该命令的功能为逐行比较两个文本文件，列出其不同之处。它比comm命令完成更复杂的检查。它对给出的文件进行系统的检查，并显示出两个文件中所有不同的行，不要求事先对文件进行排序。

**语法：**

```
diff [选项] file1 file2
```

**选项：**

* \- b 忽略行尾的空格，而字符串中的一个或多个[空格符](https://baike.baidu.com/item/%E7%A9%BA%E6%A0%BC%E7%AC%A6?fromModule=lemma_inlink)都视为相等。如How are you与How are you被视为相同的字符串。
* \- c 采用上下文输出格式（提供三行上下文）。
* \- C n 采用上下文输出格式（提供n行上下文）。
* \- e 产生一个合法的ed脚本作为输出。
* \- r 当file1和file2是目录时，递归作用到各文件和目录上。

**示例：**

<figure><img src="/files/ervCfYbcgqu52siUoqXD" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hezhiqiang.gitbook.io/about-the-author/linux-yun-wei-guan-li/linux-wen-jian-yu-mu-lu-guan-li.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
