# 1.1 文件的类型和权限

Linux 优秀的地方之一就是它的多人多任务环境，而它的文件权限管理就能确保每个用户都拥有自己的私密文件。

Linux 的文件身份有三种，分别是拥有者（owner）、所属群组（group）和其它人（others），且这三种身份分别有各自的读（read）、写（write）、执行（execute）权限。

## 1. 文件的相关属性

`ls`（list）命令就可以显示出文件的相关属性。

```bash
ls [OPTION]... [FILE]...
```

### 1.1 `ls` 命令

<table><thead><tr><th width="99">分类</th><th width="77">命令</th><th width="194"> </th><th>含义</th></tr></thead><tbody><tr><td>最常用</td><td>-l</td><td></td><td>使用长(long)列表格式</td></tr><tr><td></td><td></td><td>--full-time</td><td>显示完整时间<br>等价于 <code>-l --time-style=full-iso</code></td></tr><tr><td></td><td>-a</td><td>--all</td><td>会显示隐藏入口，即以<code>.</code>开头的条目</td></tr><tr><td>实用</td><td>-h</td><td>--human-readable</td><td>和<code>-l</code>一起，会把文件大小显示成更可读的形式<br>比如 1K, 234M, 2G</td></tr><tr><td></td><td>-1</td><td></td><td>单列输出</td></tr><tr><td></td><td>-p</td><td></td><td>在目录后加指示符 <code>/</code></td></tr><tr><td></td><td>-F</td><td>--classify<br>--file-type</td><td><p>在文件名后加 <code>/*@|=></code> 等指示符<br>- <code>/</code> 目录</p><p>- <code>*</code> 普通的可执行文件<br>- <code>@</code> 符号链接<br>- <code>|</code> FIFOs 管道<br>- <code>=</code> 套接字(sockets)<br>什么都没有则表示是普通文件</p></td></tr><tr><td></td><td>-R</td><td>--recursive</td><td>递归列出子目录的内容</td></tr><tr><td>排序</td><td>-S</td><td></td><td>排序(sort)，按文件大小</td></tr><tr><td></td><td>-t</td><td></td><td>排序，按修改时间 (modification time)</td></tr><tr><td></td><td>-u</td><td></td><td>排序，按访问时间 (access/use time)</td></tr><tr><td></td><td>-r</td><td>--reverse</td><td>排序时倒序</td></tr><tr><td>其它</td><td>-s</td><td>--size</td><td>打印每个文件的分配大小，以块为单位</td></tr><tr><td></td><td>-L</td><td></td><td>当显示符号链接(symbolic link)的文件信息时，<br>显示链接引用的文件信息而不是链接本身的信息</td></tr><tr><td></td><td>-B</td><td>--ignore-backups</td><td>不列出以<code>~</code>结尾的隐藏备份文件</td></tr></tbody></table>

更多选项可查看 `ls --help`

### 1.2 示例

eg1. 单列输出 `ls -1`&#x20;

<img src="https://605825044-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUa7MztTVfoHQxXozBQf%2Fuploads%2FJjjyZhYAtXHMnAShhxMO%2Fimage.png?alt=media&#x26;token=65d1bb7d-671b-425c-bc57-1c9452e7c620" alt="" data-size="original">

eg2. 查看详情 `ls -lah`

![](https://605825044-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUa7MztTVfoHQxXozBQf%2Fuploads%2F2J7exvg41dj0OzxgIHD6%2Fimage.png?alt=media\&token=a1c39b56-e6fb-4efe-b666-995c4f717924)

eg3. 显示完整时间 `ls --full-time`

![](https://605825044-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUa7MztTVfoHQxXozBQf%2Fuploads%2F2Eiuaowm8pqs7oAUy7in%2Fimage.png?alt=media\&token=c81bc97f-8573-469d-9c32-16695f586b92)

eg4. 按文件大小排序 `ls -lahS` 和 `ls -lahSr`

![](https://605825044-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUa7MztTVfoHQxXozBQf%2Fuploads%2Fcto0yci9kratkWqVGjMN%2Fimage.png?alt=media\&token=47b23e20-3727-4b1f-8c69-db760c1a7863)

eg5. 按修改时间排序 `ls -laht` 和 `ls -lahtr`

![](https://605825044-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUa7MztTVfoHQxXozBQf%2Fuploads%2FS7Rz09gNY4Wb1Rn9zn1S%2Fimage.png?alt=media\&token=588c795c-b74b-45f1-8f23-d585023fad73)

eg6. 手动指定 `ls` 的目录/文件，默认是当前目录

![](https://605825044-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUa7MztTVfoHQxXozBQf%2Fuploads%2FiOTnCYSx0fkGnhcKGtPn%2Fimage.png?alt=media\&token=9e6c425f-f36d-4b79-bb5f-e2ed810de73d)

### 1.3 `ls -l` 的第一列

`ls -l` 会显示 7 列数据，如下：

```shell
# 类型+权限 链接数/第一级子目录数 拥有者 所属用户组 大小 最后修改时间 文件名 
-rwsr-xr-x    1 root root  32208 Oct 31  2018 su
---s--x--x    1 root root 147392 Oct 31  2018 sudo
lrwxrwxrwx    1 root root      7 Dec 18  2018 bin -> usr/bin
drwxr-xr-x.   4 root root   4096 Dec 24 21:45 home
drwxr-xr-x.  92 root root  12288 Dec 24 19:22 etc
```

重点看第 1 列，代表了这个文件的类型和权限，它共有 10 个字符。如下：

![](https://user-images.githubusercontent.com/7055639/147410322-9794745c-a163-44e9-af7f-76a8ab013dee.jpeg)

其中，第 1 个字符代表文件类型，接下来是三组 `rwx` 权限，依次是文件拥有者的权限、文件所属用户组的权限和其它人的权限。

* 文件类型，最常见的有：
  1. `-`   普通文件
  2. `d`  目录文件
  3. `l`  符号链接/链接文件
* `rwx` 权限，其中：
  1. `r`  read，表示可读
  2. `w`  write，表示可写
  3. `x`  execute，表示可执行
  4. `-` 表示没有相应位置的权限

比如 `drwxr-xr-x` 就表示此文件是一个目录文件，拥有者可读可写可执行，同用户组的用户可读可执行，其它用户可读可执行。

<figure><img src="https://605825044-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUa7MztTVfoHQxXozBQf%2Fuploads%2FZID58hdjsjs1R4YoeF21%2Fimage.png?alt=media&#x26;token=0a8c129e-d362-43dd-8d67-1be072e9986f" alt=""><figcaption><p>图片来源于网络</p></figcaption></figure>

## 2. 文件的类型

任何设备在 Linux 下都是文件，所以 Linux 里的文件种类非常多。

### 2.1 常见类型

常见的文件类型有：

1. 普通文件/常规文件 `-`。按照文件内容，又大概可以分为：
   * 纯文本文件（ASCII）
   * 数据文件（data）
   * 二进制文件（binary）
2. 目录文件 `d`
3. 链接文件 `l`。类似于 Windows 系统里的快捷方式
4. 设备与设备文件（device）。与系统周边和存储等相关的文件，通常存储在`/dev`目录下
   * 区块设备文件 `b`（block）：就是一些存储数据，以提供给系统随机存取的接口设备，比如硬盘/软盘都是块设备
   * 字符设备文件 `c`（character）：就是一些串行端口的接口设备，比如键盘/鼠标，它们的特色就是一次性读取
5. 套接字文件 `s`（sockets）。此类型的文件通常被用于网络上的数据交换，通常在`/run`或`/tmp`中能看到这种类型的文件
6. 管道文件 `p`（FIFO, pipe）

### 2.2 三种方式

要想查看文件的类型，有三种方式：

1. 用 `-l` 选项，看第一列的第一个字符
2. 用 `-F` 选项，看文件名后面的指示符
3. 看终端的颜色

<table><thead><tr><th width="130">文件类型</th><th width="127">-l 选项</th><th width="114">-F 选项</th><th>终端颜色</th></tr></thead><tbody><tr><td>普通文件</td><td><code>-</code></td><td>无</td><td>白色</td></tr><tr><td></td><td><code>-</code></td><td>无</td><td>红色（压缩文件或归档文件）</td></tr><tr><td></td><td><code>-</code></td><td><code>*</code></td><td>绿色（可执行文件）</td></tr><tr><td>目录文件</td><td><code>d</code></td><td><code>/</code></td><td>蓝色</td></tr><tr><td>链接文件</td><td><code>l</code></td><td><code>@</code></td><td>浅蓝色（链接文件）<br>红色闪烁（链接文件存在问题）</td></tr><tr><td>设备文件</td><td><code>b</code> 区块<br><code>c</code> 字符</td><td></td><td>黄色</td></tr><tr><td>套接字文件</td><td><code>s</code></td><td><code>=</code></td><td></td></tr><tr><td>管道文件</td><td><code>p</code></td><td><code>|</code></td><td>青黄色</td></tr></tbody></table>

`ls -lF` 看第一列的第一个字符、看文件名后的指示符、看颜色。如下：

![](https://605825044-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVUa7MztTVfoHQxXozBQf%2Fuploads%2FC21GZk6j1k0CFCMZKbsd%2Fimage.png?alt=media\&token=7514c240-baf9-4054-a35c-e7bd9e06a8ad)

## 3. 文件的权限

目录和文件的权限意义并不相同，因为它们所记录的数据内容不同。

### 3.1 文件

文件是实际包含数据的地方，包括一般文件、数据库文件、二进制可执行文件等。

所以，权限对于文件来说，都是针对文件的内容的。如下：

1. `r` 可读：可以读取此文件的实际内容
2. `w` 可写：可以编辑文件的实际内容（但不包括删除该文件）
3. `x` 可执行：该文件具有可以被系统执行的权限
   * 在 Linux 中，文件能否被执行是由此权限来决定的，而和文件的扩展名（后缀）没有什么关系
   * 在 Linux 中，如果文件可以被执行，但它能否被执行成功，则取决于文件的内容

### 3.2 目录

文件是存放实际数据的地方，而目录是记录文件名列表的。

所以，权限对于目录来说，都是针对目录内的文件名列表的。如下：

1. `r` 可读：可以读取目录结构列表，即可以利用`ls`命令把此目录的内容列表显示出来
2. `w` 可写：可以改动该目录结构列表，包括以下：
   * 可以建立新的文件和目录
   * 可以删除已经存在的文件和目录（不论该文件的权限是什么）
   * 可以修改已经存在的文件和目录的名字
   * 可以移动该目录内的文件和目录的位置
3. `x` 可执行：表示用户能否进入该目录成为自己的工作目录，即能否`cd`进来

<table><thead><tr><th width="85.33333333333331">权限</th><th width="174">文件</th><th>目录</th></tr></thead><tbody><tr><td><code>r</code></td><td>可读取“文件内容”</td><td>可读取“目录结构列表”</td></tr><tr><td><code>w</code></td><td>可编辑“文件内容”</td><td>可改动“目录结构列表”</td></tr><tr><td><code>x</code></td><td>可执行该文件</td><td>可进入该目录</td></tr></tbody></table>
