%%
# 纲要
> 主干纲要、Hint/线索/路标
- 文件相关命令:
- 文件管理:新建、删除、查看文件内容、文件类型、文件属性
- 文件打包、压缩、解压
- 文件权限管理:修改文件权限、文件所有者和所属组
- 目录相关命令:
- 目录切换、目录管理、查看目录列表
%%
# 目录相关
## 目录切换 🐢
#### 查看当前工作目录—pwd
- `$ pwd` 🐢
#### 切换工作目录—cd
- `$ cd [-LP] [dir | -]` 🐢 :未指定目录时,**默认进入家目录**,`-` 表示**切换到前一目录**
#### 目录栈—pushd, popd, dirs
- `$ pushd [directory | +n]` 🐢:
- `directory`: 将**指定目录**压入到目录栈中(压入栈顶,也即作为**当前工作目录**)
- `+n` 将目录栈中编号为`n` 的目录**移至栈顶**
- `$ popd [+n]` 🐢:从目录栈中**弹出/移除** 栈顶目录
- `+n` 将目录栈中编号为`n` 的目录**弹出**
- `$ dirs [OPTION]` 🐢:显示目录栈的内容(**栈顶始终是当前工作目录`pwd`**)
- `-c`:清空目录栈
- `-l`:对家目录显示其完整路径(默认显示为 `~`)
- `-v`:每行显示一个目录项,包括其在**栈中的序号**
> [!NOTE]
>
> 目录栈中的 "**栈顶目录**(`#0`)" 始终双向绑定着 "**当前工作目录**",因此,目录栈**==永远非空==**:
>
> - 每当栈顶目录改变时,当前工作目录也会改变。
> - 每当切换当前工作目录时,栈顶目录也会改变。
>
>
>
>
> ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-EEB28A7E9F3FA10794A2A32AA225EAD9.png]]
>
> ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-831FC9C4C8241CD76BF8CAEC8146B176.png|287]]
>
> ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-FE5334236D8627748802CF0CB80194C9.png|403]]
>
<br><br>
## 目录管理
#### 创建新目录
- `$ mkdir [OPTION] <dir>` 创建单级目录
- `-p` : 创建多级目录,即父目录不存在时同时创建各级父目录
#### 删除空目录
- `$ rmdir [OPTION]... [DIRECTORY]...`: 删除**空目录**(只能删除空目录)
- `-p`:同时删除所有父目录
```shell
# 示例: 删除家目录下的sub_dir1/sub_dir3/sub_dir3这三级目录
cd
rmdir -p sub_dir1/sub_dir2/sub_dir3
```
#### 删除非空目录
![[02-开发笔记/11-Linux/Linux 命令行/Linux-文件与目录相关命令#^2gw6bp]]
#### 移动目录(重命名目录)
同移动文件(重命名文件):
![[#移动文件 (重命名文件)]]
<br><br>
# 查看目录列表
###### ls 命令
- `$ ls [OPTION] [DIR...]`:查看**当前目录或指定目录**下的文件
- `-a`: 显示所有文件 (包括隐藏文件)
- `-l`:以长列表格式显示
- `-o`:类似 `-g`, 但是不显示文件所有者字段
- `-g`:类似 `-l`, 但是不显示文件组字段
- `-F`:文件名后显示**文件类型指示符 indicator** :`*/=>@|`
- `-d`:只显示**目录本身**, 不显示目录的内容
- `-i`:显示文件或目录的 **inode 编号**
- `-s`:显示每个文件**实际占用的磁盘存储空间的大小**(默认以 KB 为单位)
- `-h`:以**人类易读的格式**显示**文件大小**(显示 MB、GB 等单位)
- 排序相关:
- `-t`:按 "**最后修改时间**" **降序**排列(最近修改->最旧降序)
- `-u`:按 "**最近访问时间**" **降序**排列 (最近访问->最旧降序)
- `-S`:按 "**文件大小降序**" 排列
- `-r`:逆序排列
- `-R`:递归地显示指定目录中的所有直接、间接的子目录和文件的信息,即**显示整个目录树**
> [!NOTE] `$ ll` 为 `$ ls -alF` 别名
>
> ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-8E68E254AC38D36D8255C74A93314445.png|213]]
>
>
> [!NOTE] 关于 `-l` 显示的时间
>
> - `-l` 默认**显示最后修改时间**;
> - `-lu` 显示 "**最后访问时间**";
> - `-lc` 显示 "**文件状态(权限、所有者)的最后修改时间**"
> [!NOTE] 注意区分 `ls -sl` 中显示的两列 "大小" 的不同含义:
>
> - 第一列是 “**文件实际占用的磁盘存储空间的大小**",在 `-s` 选项下才会显示;
> - 中间一列是 "**文件内容的实际大小,即文件长度**",在 `-l` 选项下即会显示。
>
> "文件长度" ≠ "文件实际占用的磁盘空间大小",原因在于(1)**磁盘空间是按 "数据块" 分配的**;(2)文件内容中可能存在 "空洞"。
>
> ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-F36093AE570BA8E28D5DF3D1E93E0F5C.png|798]]
>
> ^x14wwr
>
> [!NOTE] 文件类型指示符
>
> `ls` 带 `-F` 选项时,文件名后将显示 "类型指示符":
>
> - `*` 号为可执行文件;
> - `/` 表示为目录;
> - `@`为符号链接
> - `=`为套接字
> - `>`为"门" (轻量级进程间通信)
> - `|`表示 FIFO 管道,用于进程间通信
>
> 没有标号则表示为"**非可执行文件**"
>
> ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-EC0F3D3AE906EFE6BC7510F9C056A2A3.png]]
>
```shell
# 以列表格式查看所有文件(包括隐藏文件)
ll # 等价于ls -alF
# 按最近->最旧的"最后修改时间"降序显示目录列表
ls -lt
# 按最近->最旧的"最后访问时间"降序显示目录列表
ls -lu
# 上述两个命令再带一个`-r`则逆序, 反过来最旧->最新升序显示
```
<br><br>
## 查看目录树
###### tree 命令
> ubuntu 上没有自带该工具。
![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-4FC9D62A9AFC086D32E0742C082B17E0.png|767]]
<br><br><br>
# 文件相关
## 管理文件
#### 创建空文件/更新文件最后修改时间
- `$ touch <filename>` :创建空文件,或**更新文件的最后访问与修改时间**(不改变文件内容)
#### 删除文件或目录
- `$ rm [OPTION]... [FILE]...`: 删除**指定文件或目录** ^2gw6bp
- `-i`:删除前询问
- `-r`:**递归地删除目录及其下的所有文件和子目录**(删除目录必须用 `-r` 选项)
- `-f`:**强制删除**(删除非空目录时需要)
-
![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-A6DD189A944A45C6F5EC05BC11CD5B1F.png|283]]
```shell
rm -i my_file
rm -i f?ll # 通配符匹配文件名
rm -f my_file # 强制删除文件
rm -r dir # 删除目录
rm -rf test_dir1/ # 删除非空目录——强制、递归地删除目录及其中的所有文件
rmdir empty_dir # `rmdir`只能删除空目录
```
#### 拷贝文件—cp
> 如果目标文件已存在,则 `cp` 默认将**覆盖目标文件**。
- `$ cp [OPTION]... <SOURCE>... <DIRECTORY>`: 将**文件或目录**拷贝到**指定目录**(默认将直接覆盖重名文件,无提示)
- `-i` :询问是否覆盖已有文件
- `-r` :递归复制整个目录

```shell
cp -i test_one ~/hht/ # 复制文件到"~/hht/"目录下
cp -r test_dir1/ test_dir2/ # 递归地复制整个目录的文件
```
#### 移动文件 (重命名文件)
> 移动文件只影响文件名,inode 编号和时间不变。
- `$ mv [OPTION] <src> <dst>`:**移动文件或目录**
- `-i` :询问是否覆盖已有文件
```shell
mv t_old t_new # 重命名文件
mv t_old ../t_old # 移动文件
mv t_dir1/ t_dir2/ # 重命名目录
mv t_dir2/ ../t_dir2 # 移动目录
# 移动多个文件到一个目录中
# mv [option] file1 file2 ... dest
mv file1.txt file2.txt file3.txt /path/to/destination/
# 使用通配符移动多个文件
mv *.txt /path/to/destination
```
#### 创建临时文件
> `mktemp` 命令用于**安全地创建一个临时文件或目录**,该命令**确保生成的文件名是唯一的**。
- `mktemp [OPTION] [TEMPLATE] `: 在**默认临时目录**中 **根据模版`TEMPLATE`** 创建一个**唯一的临时文件**,输出文件名。
- `-d`:创建一个**临时目录**
- `-p DIR` | `--tmp_dir=[DIR]`: 指定临时文件或目录的**路径前缀 `DIR`**(该选项被`mktemp`命令默认使用)
- `-p` 选项必须指定 `DIR` ,即临时文件或目录的**完整路径**将为 `DIR/TEMPLATE`;
- `--tmp_dir` 的`DIR` 参数是可选的,未指定时则使用 `$TMPDIR` 变量指定的路径(如果该变量存在),否则使用 `/tmp` 路径。
- 模版`TEMPLATE`:
- 可包含任意字符,至少以 3 个连续的`XXX` 结尾,这些 `X` 会被随机字符替换以保证文件名的唯一性。
- **如果未指定`TEMPLATE`,则默认使用 `tmp.XXXXXXXXXX` 并使用 `--tmpdir` 选项。**
- 可**使用绝对路径直接指定路径前缀**,无需`-p` 或 `--tmp_dir` 选项和参数
示例:
> [!NOTE] `mktemp` 命令创建的文件 **具有特定的安全权限(通常是 600),即==只有文件的创建者具有读写权限==(root 除外),而不使用默认`umask`值**。
> [!example]
>
> 示例一: `mktemp mytemp.XXXXXX` 会在 "**当前目录**" 中创建一个以 `mytemp.` 开头的临时文件,其余部分由六个随机字符组成。
>
> 
>
> 示例二:`mktemp --tmpdir file.XXXXXX` 会在`/tmp` 目录下创建临时文件
>
> 
>
> 示例三:`mktemp /tmp/file.XXXXXX` 使用绝对路径直接指定路径前缀,将在`/tmp` 下创建临时文件
>
> 
>
> 示例四:`mktemp -d /tmp/mydir.XXXXXX` 将在`/tmp` 中创建以 `mydir.` 开头的**临时目录**。
<br><br>
## 查看文件类型
- `$ file [name...]`:查看文件类型
```shell
file ~/.bashrc # 输出: home/yht/.bashrc: ASCII text
file /bin # 输出: /bin: symbolic link to usr/bin
file /usr/bin/ls # 输出二进制文件信息, 包括编译时面向的平台以及需要何种类型的库.
```
> [!info]
>
> file 给出的**二进制可执行文件信息**说明:
>
> ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-2ECFDEDC541601E469D7323C96536105.png]]
>
>
> ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-CCB5D8FF9D860BE39E7FA5AA8BE4BB93.png|559]]
>
<br><br>
## 查看文件属性
###### 查看所有已打开的文件描述符
- `$ lsof` :列出整个 Linux 系统打开的所有文件描述符,包括所有后台进程以及登录用户打开的文件。
- `-a`:合并选项(或 OR)
- `-p`:指定进程 PID
- `-d`:指定要显示的文件描述符编号
<br>
## 查看 inode 相关信息
> [!NOTE] 查看 inode 相关信息
>
> - `stat <file>`:查看文件的详细 inode 信息
> - `ls -i`:查看文件的 inode 号
> - `df -i`:查看各文件系统中 inode 使用情况
>
> ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-40E76576242539B8DE07CC701D8EA111.png|566]]
>
> ^nzcq1t
<br><br><br>
# 查看文件内容
> [!summary]
> - `cat` 或 `more` 需要先载入**整个文件**才能显示内容,`less` 则不需要
> - `head` 和 `tail` 则只显示文件开头或尾部的若干行。
#### 查看文件全部内容
- `$ cat [OPTION] [file]...` **拼接文件**并打印到**标准输出**
- `[file]`:未指定 `file` 时,取标准输入的内容
- `-n`:显示行号
```shell
cat -n file # -n 给所有输出的行 加上行号
cat -b file # -b 给所有输出的"非空行" 加上行号
cat fil1 fil2 file3 # 拼接file1,file2,file3的文件内容并打印
```
> [!NOTE] `cat` 与 `echo` 的区别:
>
> - `cat`:读取**文件内容**并将其输出到**标准输出**(通常是终端)
> - `echo`:将指定的**字符串**输出到**标准输出**。它通常用于**打印文本**、**查看变量值**或**将文本写入文件**。
>
#### 分屏查看文件内容
> [!NOTE] 分页工具
>
> 分页工具每次只**显示一屏内容并停留**,有两种工具:
>
> - `more` 是**一次性加载完整个文件内容**后再进行分页显示;
> - `less` 是**根据显示需要每次只加载部分文件内容**(因此打开**速度非常快**)
> - `less` 是基于 `more` 和 `vi` 的工具,还具有**搜索文本**的功能;
> [!tip] **==分页工具==**(Pages)快捷键
>
> - 基本快捷键(`more` 与 `less` 共有)
> - **滚动**:`↑↓` 键, `Enter` 键逐行显式
> - **翻页**:`Space` | `Page down` 键下翻一页; `b` | `Page Up` 键上翻一页;
> - **移动到内容首尾**:`g` | `home` 移动到内容首; `G` | `end` 移动到内容尾
> - **退出**:`q` 键
> - **显示当前屏幕首行行号**:`=` 键
> - **显示文件名及当前屏幕首行的行号**:`:f` 键(`more` 特有)
> - **查看分页工具的帮助信息**:`h` 键
>
> - **搜索文本**(`less` 特有功能)
> - **进入搜索模式**(输入关键词,再按 `Enter` 键进行搜索)
> - 按 `/` 键进入 "**向后搜索**" 模式,
> - 按 `?` 键进入 "**向前搜索**" 模式
> - **跳转至下/上一个匹配项**:`n` 键/ `N` 键:
>
> tip:在分页程序中,键入 `!` 后可输入一条 shell 命令并执行,当命令执行完成后,可按下 `Enter` 键返回到分页程序中。示例如下:
>
> ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-578AB7A3BFF29FFD5A1EC856F11FE84D.png|439]]
>
> ^jfk51w
>
###### more 工具
- `$ more <file>` **分页显示**文件内容
> [!tip] `cat` 联合 `more` 使用
>
> ```shell
> cat -n file | more # 推荐用法
> ```
>
###### less 工具
- `$ less <file>` **分页显示**文件内容;
#### 查看文件首尾内容
- `$ head [OPTION] <file>`:显示文件头部内容,默认显示文件的**头部 10 行**
- `-n<num>`: 显示文件前 `num` 行内容
- `$ tail [OPTION] <file>`:显示文件末尾内容,默认显示文件的**末尾 10 行**
- `-n num`: 显示文件最后 `num` 行内容
- `-f` 表示循环读取,常用于查阅正在改变的日志文件;显示一直持续,`Ctrl+C` 退出。
```shell
head -n<num> file # 显示文件前num行内容
tail -n<num> file # 显示文件末尾num行内容
```
<br><br><br>
# 链接相关
#### 创建链接
- `ln [OPTION] <TARGET> <LINK_NAME>` :为指定文件创建一个名为 `LINK_NAME` 的**硬链接**
- `-s` :创建**符号链接(软链接)**
```shell
ln target link_name # 创建硬链接
ln -s target link_name # 创建符号链接
# 示例: 在当前目录下为`/root/`目录创建一个软链接
ln -s /root/ myroot
```
#### 删除链接
使用 `rm`,同删除文件。
#### 查找链接
`$ readlink -f <file>` 找出一系列链接文件的最后一环
<br><br><br>
# 文件打包、压缩、解压
## 文件打包 | 压缩 | 解压一体化— `tar` 工具
> [!NOTE] `tar` 工具(tape archive)
> `tar` 工具用于创建、维护、修改 "**tar 归档文件**"——一种**将多个文件和目录组合成单个文件**的方式,用于备份、文件传输和在系统间移动大量文件。
>
> tar 文件通常有 `.tar` 扩展名,可通过命令选项**指定同时使用 gzip、bzip2 等工具进行压缩**,分别生成 `.tar.gz` 或 `.tar.bz2` 文件。
>
命令: `$ tar function [options] [FILE...]` **打包或解包文件或目录**
常用操作(`function`):
![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-0FBA53B00344D908FA0E4DDB38B4C7EC.png|839]]
常用选项(`option`):
- `-v`:在处理文件时显示详细信息(verbose 模式)打包或解包过程中显示正在处理的文件名
- `-f ARCHIVE`:指定**归档文件(包)的名称**
- `-C dir` :**解压到指定目录**
- `-z`:通过 gzip 对归档文件进行**压缩或解压缩**。
- `-Z`:通过 compress 命令对归档文件进行压缩或解压缩。
- `-j`:通过 bzip2 对归档文件进行压缩或解压缩。
- `-J`:通过 xz 对归档文件进行压缩或解压缩。
- `--exclude`:在创建归档时排除特定的文件或目录。``
> [!NOTE]
>
> `function` 是**tar 工具下的不同操作**,每种操作后再跟上** option 选项**。例如:
>
> - `tar -cvf` 中,操作是 `-c`:创建 tar 文件,后跟选项 `-v` 和 `-f`。
> - `tar -tf` 中,操作是 `-t`:列出 tar 文件内容,后跟选项 `-f`。
>
> 其中,**`f` 参数必须放在最后,跟上要处理的文件名。**
##### 使用示例
- `$ tar -cvf <ARCHIVE> [FILE...]` :**打包文件**
- `$ tar -xvf [FILE...]` :**解包文件**
```shell
# 创建一个名为 test.tar 的归档文件,包含目录 test 和 test2 的内容。
tar -cvf test.tar test/ test2/
# 解包/提取tar文件中的内容到当前工作目录
tar -xvf test.tar
# 解包/提取tar文件中的内容到"指定目录"
tar -C "../../folder" -xvf test.tar
```
> [!tip] `tar -xzf <FILE>` 会直接将压缩包中所有文件**解压到当前目录下**。
>
> 通常应当先通过 `tar -tzf <FILE>` 查看压缩包内**是否具有 "顶层目录"**,避免所有文件散落到当前目录。
>
> 若压缩包内无顶层目录,可通过 `-C <dir>` 解压到指定目录:
>
> ```shell
> # 查看压缩包内是否有顶层目录
> tar -tzf folly-v2024.06.30.00.tar.gz
> # 解压到指定的folly-release目录下
> mkdir folly-release
> tar -xzf folly-v2024.06.30.00.tar.gz -C folly-release
> ```
>
>
- `$ tar -zcvf <ARCHIVE> [FILE...]`:**打包并压缩**
- `$ tar -zxvf [FILE...]`:**解压缩包**
```shell
# 注: `.tar.gz` 或 `.tgz` 是经gzip压缩过的tar文件.
# 创建一个 tt.tgz 压缩包, 包含目录 test 和 test2 的内容。
tar -zcvf tt.tgz test/ test2/
# 解压缩包 tt.tgz
tar -zxvf tt.tgz
# 将压缩包解压到`/usr/local`目录下.
tar -C /usr/local -zxvf abc.tar.gz # -C dir 切换到指定目录
# 解软件压缩包
sudo tar -C /opt -xzf nvim-linux64.tar.gz
```
- `$ tar -tf [FILE...]`: 查看**打包/压缩包**中的文件内容
```shell
# 列出/显示tar文件test.tar中的内容
tar -tf test.tar
# 对`xz`压缩包, 需要用-J选项
tar -Jtf mysql-8.4.3-linux-glibc2.28-x86-64.tar.xz
```
> [!NOTE]
>
> `tar` 命令的选项格式(三种等效格式)
>
> - **Traditional Usage**:例如 `tar cvf`,`tar xvf`
> - **UNIX-style usage**:例如 `tar -cvf`,`tar -xvf`
> - **GNU-style usage**
>
> ![[_attachment/02-开发笔记/11-Linux/Linux 命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-6153786E1C6F209BE493D8BEB31E7A89.png|400]]
<br>
## 文件压缩 | 解压 —— `gzip` 工具
> [!NOTE]
>
> gzip 是 Linux 中最流行的压缩工具,是 GNU 项目的产物。压缩文件扩展名为 `.gz`。
>
> gzip 软件包包含以下命令行工具:
>
> - `gzip`: 用于**压缩**文件(也可解压文件)
> - `gzcat`: 用于查看压缩过的**文本文件**的内容。
> - `gunzip`: 用于**解压**文件
- `$ gzip <FILE> `:**压缩**指定文件
- `-l`:列出压缩文件的相关信息。该命令是针对"**已压缩文件**"(压缩包), 列出其相关信息;
- `-d`:**解压文件**
- `-v`:显示执行过程的详细信息
- `$ gunzip FILE`:**解压缩**指定**压缩包文件
```shell
# 压缩文件
gzip my* # 压缩当前目录下以"my"开头的多个文件
gzip * # 压缩当前目录下的所有文件
gzip -l <fname> # 列出压缩文件的相关信息. 该命令是针对"已压缩文件", 列出其相关信息.
gzip -d <fname> # 解压文件
gzip -dv <fname> # 解压文件并列出详细信息 -v:verbose, 显示执行过程
```
<br>
## 文件压缩 | 解压 —— `unzip` 工具
`unzip` 工具用于**处理 `.zip` 压缩包**
```shell
# 解压.zip文件至当前目录
unzip filenam.zip
# 解压.zip文件至指定目录
unzip filename.zip -d /path/to/dest
# 列出.zip文件内容
unzip -l filename.zip
```
<br><br><br>
# 文件权限管理
#### 查看文件权限
- `ls -l [FILE...]`: 查看文件权限
#### 查看/设置新建文件与目录的默认权限 🐢
- `$ umask` 🐢 : 显示当前用户的**默认权限掩码**
- `$ umask xxx` 🐢: 设置当前用户的**默认权限掩码**
用户最终的默认权限由 **"全权限值**"与"**umask 掩码"** **相减**得到。
例如,**常规文件的全权限值是`666`,设置`umask 026`,则用户默认的常规文件权限变为`640`**。
> [!NOTE] **全权限值**(full permission):
>
> - **不可执行的普通文件**:`666`( `rw-rw-rw-` 权限)
> - **可执行的普通文件**:`777` (`rwxrwxrwx`)
> - **目录**: `777`(`rwxrwxrwx` )
> [!NOTE] **umask 权限掩码**
>
> - umask 是 4 位八进制的**掩码值**,第 1 位为**特殊权限位**,后 3 位为**用户/组/Other 的八进制权限值的掩码**。
>
> - umask 值通常会被设置在 `/etc/profile` 启动文件中
#### 修改文件权限
- `$ chmod [OPTION] mode file` :修改文件权限
- `mode`:指定权限,可使用**八进制模式**或**符号模式**来进行安全设置
```shell
# 八进制模式示例
chmod 664 myfile.txt
# 符号模式示例
chmod u=rwx,go=r myfile.txt
chmod u+x,o+r myfile.txt
chmod u+s file.txt # 设置SUID位
chmod u-s file.txt # 移除SUID位
chmod g+s dir # 设计SGID位
chmod g-s dir # 移除SGID位
chmod o+t dir # 设置粘滞位
chmod o-t dir # 移除粘滞位
# 修改目录及其中所有文件的权限
chmod -R 777 mydir # -R: 以递归方式修改文件和目录的权限
```
权限表示方式:

**符号模式**:`chmod [ugoa...][+-=][rwxXstugo] `


其中:
- 第三位的 `s` 只能和第一位中的`u` 或 `g` 搭配使用,
- 第三位的 `t` 只能和第一位中的`o` 搭配使用。
- 第三位的`ugo` 只能和第二位的 `=` 搭配使用。
其它搭配都是无效命令。
#### 修改文件所有者
- `$ [sudo] chown [options] owner [:group] file` 修改文件的属主或属组
其中,冒号分隔符`:` 也可以改为点分隔符`.`,即`[.group]`,二者等效。
> 两种都是合法命令。早期的 Unix 系统中支持的是点分隔符,而冒号分隔是现在 Linux 中推荐的语法,但也同时兼容点分隔。
```shell
# 示例: 修改文件所属用户
chown new_owner file.txt
# 示例: 修改文件所属组
chown :new_group file.txt
# 示例: 同时修改文件所属用户 & 所属组
chown new_owner:new_group file.txt
chown new_owner.new_group file.txt # `:`或`.`都可以
chown test: file.txt # 用户登录名与组名相同则`.`后的组名可省略
chown -R new_owner:new_group dir # -R: 递归修改所有文件
```
#### 修改文件的所属组
- `$ [sudo] chgrp group file` 修改文件的所属组
该命令允许普通用户修改文件的所属组,只要用户是该组的一员。
#### 查看 / 设置访问控制列表
- `$ getfacl file` 查看文件的访问控制列表
- `$ setfacl [options] rule file` 设置文件的访问控制列表
- `-m` :修改分配给文件或目录的 ACL 访问权限
- `-x` :删除特定权限
- `rule` 规则格式:
- 设置访问 ACL:
- `u[ser]:<uid|username>:perms` 为用户分配权限
- `g[roup]:<gid|groupname>:perms` 为组分配权限
- `o[ther]::perms` 为其它用户分配权限
- 设置默认 ACL:
- 为上述规则添加前缀 `d:` 设置目录的默认 ACL 权限(该目录下的新建文件和目录将继承该默认 ACL 权限)
```shell
# 设置访问ACL权限:
setfacl -m u:username:rw file.txt # 指定用户可读可写
setfacl -m g:gname:r file.txt # 指定组只读
# 删除ACL权限
setfacl -m g:gname file.txt # 移除指定组的权限
# 为目录设置默认ACL权限:
setfacl -m d:u:username:r directory # 指定用户只读
```
<br><br><br>
# 参考资料
# Footnotes