%% # 纲要 > 主干纲要、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` :递归复制整个目录 ![image-20230927194351872|682](_attachment/02-开发笔记/11-Linux/Linux%20命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-B96295309F7D2DE81DD19F764EA17D06.png) ```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.` 开头的临时文件,其余部分由六个随机字符组成。 > > ![image-20240107225711171|492](_attachment/02-开发笔记/11-Linux/Linux%20命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-7585FE0F716ABB132575C878F1479627.png) > > 示例二:`mktemp --tmpdir file.XXXXXX` 会在`/tmp` 目录下创建临时文件 > > ![image-20240107233201206|508](_attachment/02-开发笔记/11-Linux/Linux%20命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-5E7BA22AA821EDEBC33477E726582542.png) > > 示例三:`mktemp /tmp/file.XXXXXX` 使用绝对路径直接指定路径前缀,将在`/tmp` 下创建临时文件 > > ![image-20240107233742724|516](_attachment/02-开发笔记/11-Linux/Linux%20命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-3E4B445A330B5EF1C1FB5CB94A8304E1.png) > > 示例四:`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: 以递归方式修改文件和目录的权限 ``` 权限表示方式: ![image-20231103222323503|484](_attachment/02-开发笔记/11-Linux/Linux%20命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-125A7363992EAD1AB391A26A39469884.png) **符号模式**:`chmod [ugoa...][+-=][rwxXstugo] ` ![image-20231103223011579|522](_attachment/02-开发笔记/11-Linux/Linux%20命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-85310E53CF08C747CD9E404ED5060BC0.png) ![image-20231103223401965|420](_attachment/02-开发笔记/11-Linux/Linux%20命令行/Linux-文件与目录相关命令.assets/IMG-Linux-文件与目录相关命令-C44CBBE74504DFBF91BC1CB09EE50108.png) 其中: - 第三位的 `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