05-文件管理
05-文件管理
Linux文件系统
Linux文件系统是Linux操作系统用于组织和管理文件和目录的数据结构。它是操作系统中非常核心的部分,负责数据的存储、检索、更新和删除。在Linux操作系统中所有的内容都是以文件的形式保存和管理的,一切皆是文件。比如文件、目录、链接、硬件设备等一切都可以看作是文件。
Linux文件系统支持多种类型,最常见的就是ext4,这是Linux系统中广泛使用的文件系统,支持大文件、快速回复和存储配置。
其他的文件系统如下:
- XFS:是一种高性能的日志文件系统,特别适合处理大量数据。
- Btrfs(B-Tree Filesystem):是一种写时复制(COW)文件系统,支持压缩、快照和在线磁盘整理。
- ZFS:最初由Sun Microsystems开发,支持高存储容量和数据完整性
所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构。文件系统的最顶层是由根目录开始的,系统使用/
来表示根目录。在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含子目录文件。如此反复就可以构成一个庞大的文件系统。

在Linux文件系统中有两个特殊的目录,一个用户所在的工作目录,也叫当前目录,可以使用一个点.
来表示;另一个是当前目录的上一级目录,也叫父目录,可以使用两个点..
来表示。
每一个目录都有自己对应的功能。请看下表:
目录 | 功能 |
---|---|
/bin | 目录包含了许多基本的可执行文件,这些文件通常用于启动新的进程或执行常见的系统管理任务。 |
/sbin | 这里存放着所有系统管理员可以使用的可自行文件,通常只有超级用户有权限执行。 |
/boot | 这是系统启动所需要的文件,比如内核和引导程序Bootloader、bios等。 |
/dev | 这里存放的还是设置文件,这些文件代表了系统中的所受硬件设备、比如硬盘、网卡等。 |
/etc | 目录包含了系统的主要配置文件。 |
/home | 用于存储用户的个人文件和设置。 |
/lib | 目录包含了系统库文件,这些文件被其他程序在运行时使用。 |
/media | 目录用于挂载可移动媒体,如USB驱动器和光盘。 |
/mnt | 目录通常用于临时挂载其他的文件系统。 |
/opt | 目录用于存放可选的软件包。 |
/proc | 目录包含了当前系统状态的信息,这些信息可以由系统或用户动态生成。 |
/root | 只有超级用户(root)可以访问,用于存放系统管理员的文件和设置。 |
/run | 目录包含了运行时数据,如进程ID和套接字描述符。 |
/drv | 目录用于存放服务的数据,这些服务通常是系统运行的关键部分。 |
基本文件命令
在学习文件管理命令的时候我们要先学习了解三个基础的文件命令:pwd
、ls
、cd
。
查看目录内容
我们使用ls
命令可以查看目录下面的内容。语法如下:
ls [选项]... [文件]...
列出 <文件>(默认为当前目录)的信息。
常用选项如下:
-a, --all: 列出目录中的所有文件,包括隐藏文件(以.开头的文件)。
-A: 列出除.和..之外的所有文件。
-l: 使用长列表格式,显示文件的详细信息,如权限、链接数、所有者、组、大小、最后修改日期等。
-h, --human-readable: 与 -l 一起使用时,以可读的格式(如KB、MB)显示文件大小。
-t: 按文件修改时间排序,与 -l 一起使用可以显示详细的时间信息。
-S: 按文件大小排序。
-r: 反转排序结果。
-d: 仅列出目录本身,而不是目录的内容。
-i: 显示每个文件的inode号。
-F, --classify: 在文件名后添加指示符,如*/表示目录,@表示符号链接等。
-R, --recursive: 递归列出子目录中的文件。
-s: 显示每个文件或目录的磁盘使用量(块数)。
-n, --numeric-uid-gid: 以数字形式显示用户和组的ID,而不是名称。
--help
我们要想查看当前目录下面的文件,可以直接使用ls:
miui@fedora:~$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面 test
我们怎么去区分目录和文件呢?我们可以使用ls -F
来进行查看:
miui@fedora:~$ ls -F
公共/ 模板/ 视频/ 图片/ 文档/ 下载/ 音乐/ 桌面/ test
如果是目录,那么怒目后面会多一个斜杠。
注
提示:部分发行版Linux会对shell进行不同的样式定制,不同的文件或者目录有颜色区分。例如Fedora会区分目录和文件的颜色,目录为蓝色,文件为白色,如图:

如果我想查看其他的目录内容怎么办呢?为我们只需要在ls的后面添加路径即可,如图:

有时候有些程序或者特殊目录存在一些隐藏文件,隐藏文件只能通过ls -a
或者ls -A
来查看:

警告
注意:ls -a
和ls -A
的区别就在于是否列出当前目录和父目录。
.
列出了当前目录中的所有文件和目录,包括隐藏的文件(以.
开头的文件)。..
是一个特殊的目录项,代表当前目录的父目录。
我们还可以使用ls -l
列表的方式查看目录,请看如下操作:

除此之外我们还可以使用ls -R
递归查看每个目录中有什么文件,请看下面的案例:

除了这些操作,我们还能将命令组合起来使用,请看下面的操作:

我们还可以使用ls -alG
递归查看所有的目录和文件。
当前工作路径
我们经常会接触到开发项目,并且将其部署到服务器上面,所以我们有必要知道自己处于什么样的工作路径,我们可以使用pwd
来查看当前shell所在的工作路径。语法如下:
pwd [-LP]
选项:
-L 打印 $PWD 变量的值,如果它包含了当前的工作目录
-P 打印当前的物理目录,而不包含任何的符号链接
请看案例:
miui@fedora:~$ pwd
/home/miui
miui@fedora:~$ pwd -L
/home/miui
miui@fedora:~$ pwd -P
/home/miui
这里三个命令返回的内容一样,这是因为目前目录下面没有复合-L和-P选项的条件。
假设有一个符号链接 /home/miui/link 指向 /some/other/path,如果当前工作目录是通过该符号链接进入的,那么:
- pwd -L 将显示 /home/miui/link
- pwd -P 将显示 /some/other/path
目录切换
我们在开发部署的过程中也会遇到目录切换的情况,我们可以使用cd
来实现当前shell所在目录的位置。语法如下:
cd [-L|[-P [-e]] [-@]] [目录]
选项如下:
-L 默认行为,cd将遵循符号链接规则,并将当前工作目录更改为符号链接指向的目录。
-P 物理目录,cd不会遵循符号链接规则,耳屎直接更改为符号链接本身坐在的目录。
-e 如果指定了 -e,并且 -P 选项导致 cd 命令尝试更改到一个不存在的目录,则 cd 命令将失败并返回非零退出状态。
-@ 在某些shell(如zsh)中有效。
一般这些选项用不上,只有遇上这些情况的时候才能用上。
我们当前所在的目录是/home/miui,我们可以使用cd进入其他目录,我们不知道存在哪些目录的时候可以合理利用Tab进行提示,如下演示:

文件路径
前面的内容学习过才能理解我呢间路径,首先文件路径是什么样的?
下面这个就是一个文件路径:
/home/miui
根目录
什么是根目录?
根目录是Linux系统中的单一最高级别的目录,没有父目录。它是访问整个文件系统树的起点。一般用/
来表示根目录。要和/root
目录区分开,有些人认为/
和/root
目录是一样的。/roo
t是Linux系统中超级用户(root用户)的主目录。
家目录
什么是家目录?
家目录是每个用户私有的目录,用于存储用户的个人文件、配置和其他数据。比如我们的miui用户的家目录就是/home/miui,root用户的家目录是/root
,这样就可以把/
和/root
分开了,分开理解了,/
是根目录,/root
是家目录。
绝对路径
文件路径主要分为:绝对路径和相对路径。
绝对路径是唯一的,唯一指定一个文件或者目录的位置,是无法变动的。
例如:/home/miui
就是一个绝对路径。从根路径开始,你也可以这样理解,从根目录开始的都是绝对路径。
请看绝对路径是怎么样切换的:

相对路径
相对路径是可以变动的,不是唯一的,灵活变动的特性使其在开发的过程中更方便部署。学习相对路径我们还要学习前面提到的.
和..
。前面我们说了.
是当前目录,..
是父目录。
我举个例子,假如我们有一个文件123.txt在绝对路径/home/miui/test下面,我们以123.txt为参照物,那么test就是当前目录,这miui目录就是test的父目录,父目录包含了子目录test和test的子文件123.txt。
我给大家演示一个目录结构:
project/
├── src/
│ ├── main.py
│ ├── utils.py
│ └── helpers/
│ └── helper.py
├── data/
│ └── data.json
└── README.md
这个结构是典型的文件树,大家要能够看懂,无论是做开发还是做运维,文件树都是一个不可缺少的一个知识点。
- 首先这里的根目录的名字叫做
project
- 目录
src
和data
都是project
的子目录 src
目录下面还有main.py
文件和helper
目录,src
目录下面的所有目录和文件都是src
的子目录和子文件data
和src
是兄弟属于父亲project
,main.py
和helper
是姐弟关系,属于父亲src
重要
怎么理解相对路径?如果说绝对路径是以根目录作为参照物,作为出发点;那么相对路径就是以子目录、子文件为为参照物,以自身为出发点。
请看演示:

操作解释:这里我们以src目录本身为参照物,我要回到miui目录下面,我们用绝对路径的思路是怎么样的?是不是/home/miui
进行切换?我们使用了父目录的方式进行路径返回,src的父目录是不是project?project的父目录是不是miui?我们输入两个../
,即../../
是不是就代表了miui目录?我们再以miui目录为参照物,想要进入到src目录,我们miui目录下面是不是有project子目录?src在project下面,./
是不是代表当前目录?那么./projects/src
就代表我们要进入project,在进入到src目录?
以上就是相对路径的用法。
文件管理
创建目录
mkdir
命令用于创建目录,如果要创建的目录已经存在,系统会进行警告提示,不会再创建目录。
语法:
mkdir [选项] [目录]
-z 设置安全上下文,使用SELinux的时候有效
-m 创建目录的同时设置目录的权限
-p 递归创建目录
-v 显示目录创建的过程
--version 显示版本信息
--help 提供帮助文档
案例如下:
在当前目录下面创建多个目录
miui@fedora:~$ mkdir test1 test2 test3
miui@fedora:~$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面 project test test1 test2 test3
我们在使用文件管理操作的时候,常常和一些特殊字符一起使用,这个特殊字符一般叫做元字符。这些元字符常常与正则表达式一起使用。正则表达式我们将在下一个板块专门学习,这里了解就行了。
常见的元字符有:
- *:匹配任何数量的字符
- ?:匹配任何一个字符
- []:匹配括号之间任何一个字符
- {}:一种扩展字符,指定一个模式出现的次数
我们可以借用元字符实现创建多个目录,操作如下:
miui@fedora:~$ mkdir test{4..7}
miui@fedora:~$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面 project test test1 test2 test3 test4 test5 test6 test7
我们使用扩展字符的方式实现了创建目录test4到test7目录。
我们还可以使用递归创建目录,操作如下:
miui@fedora:~$ mkdir -p test1/doc1/m1
miui@fedora:~$ ls ./test1/doc1/
m1
miui@fedora:~$
我们使用选项-p来实现多层级的目录创建,也就是递归。
创建目录的时候设置权限我们将在后面文件权限的内容专门进行演示。你也可以直接跳转到下面的文件权限标题进行学习。
创建目录和文件都有响应的规则,规则如下:
- 文件名可以包含字母(a-z、A-Z)、数字(O-9)、下划线(_)和横杠(-),但不能以这些字符为开头。
- 文件名长度有限制,每个文件系统的最大长度可能不同,通常为 256个字符。
- 文件名中的横杠(-)具有特殊含义,用于分隔文件名和扩展名,例如:file-name.ext。
- 扩展名表示文件类型,例如:.txt 表示文本文件,jpg 表示图片文件。扩展名不是必需的,但有助于识别文件类型。
文件权限
在Linux中,我们将使用系统资源的人员分为4类:超级用户(root)、文件目录的属主(user)、属主同一组的群成员(group)和其他人员(other)。
基本的访问权限如下:
代表字符 | 权限 | 对文件的含义 | 对目录的含义 | 八进制值 |
---|---|---|---|---|
r | 读权限 | 可以读取我呢间的内容 | 可以列出文件中的文件列表 | 4 |
w | 写权限 | 可以修改文件 | 可以在该目录中创建、删除文件 | 2 |
x | 执行权限 | 可以执行文件 | 可以进入到该目录 | 1 |
我们使用ls -l
即可查看文件的全部权限,权限划分如下:

文件标识符如下:
标识符 | 类型 | 标识符 | 类型 |
---|---|---|---|
d | 目录 | - | 普通文件 |
l | 软链接 | b | 块设备 |
c | 字符设备 | p | 命令管道文件 |
s | 套接字文件 | -- | -- |
我们还可以根据某些Linux发行版命令行中的颜色来判断权限,如:
颜色 | 文件类型 |
---|---|
蓝色 | 目录 |
红色 | 压缩文件 |
浅蓝色 | 链接文件 |
灰色 | 其他文件 |
白色 | 普通文件 |
绿色 | 可执行文件 |
文件权限系统将操作文件的用户分为三大类,分别是:
- 文件的拥有着,也就是属主(user 简写[u])
- 文件所属组的成员,也就是属组(group 简写[g])
- 其他用户(other 简写[o])
警告
注意:默认文件最高权限为666(读写),目录最高权限为777(读写执行),这是因为系统对umask权限进行了定义。权限不能使用数字进行换算,必须使用字母。
文件权限修改
系统管理员和文件的属主可以根据需要来更改文件的权限。更改文件和目录的操作权限使用chmod
命令进行。文件权限有两种设置方法:文字设定法和数值设定法。
语法:
chmod [选项] [操作] [文件]
-c 如果文件权限已经更改,才显示更改动作
-f 文件权限无法被更改不需要显示错误讯息
-v 显示权限变更的详细资料
-R 对当当前目录先的所有文件与子目录进行递归式的权限变更
我们在使用文字设定方法中需要设置对文件的操作,在操作中会涉及到用户、权限操作符号和权限三个元素。
代表用户的符号如下:
选项 | 说明 |
---|---|
u | 属主(user) |
g | 属组(group) |
o | 其他用户(other) |
a | 所有用户(all) |
权限操作符号如下:
权限操作符号 | 说明 |
---|---|
+ | 增加权限 |
- | 删除权限 |
= | 赋予权限,同时覆盖掉原有的权限 |
这里我先演示文字设定方法来田间文件的权限,操作如下:
# 给用户组添加写权限
miui@fedora:~$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面 project test1 test2 test3 test4 test5 test6 test7 test.py
miui@fedora:~$ ls -l test.py
-rw-r--r--. 1 miui miui 40 2月16日 17:53 test.py
miui@fedora:~$ chmod g+w test.py
miui@fedora:~$ ls -l test.py
-rw-rw-r--. 1 miui miui 40 2月16日 17:53 test.py
这里我们给用户组添加了写入的权限,使用的是g+w
,如果你想让文件用户拥有可执行的权限,我们可以吧g+x
改成u+x,g+x,u+x
,这样写比较麻烦,我们可以直接使用-x
给所有用户添加上执行权限。
miui@fedora:~$ ls -l test.py
-rw-rw-r--. 1 miui miui 40 2月16日 17:53 test.py
miui@fedora:~$ chmod u+x,g+x,o+x test.py
miui@fedora:~$ ls -l test.py
-rwxrwxr-x. 1 miui miui 40 2月16日 17:53 test.py
我们如果要指定用户删除对应的权限,我们只需要使用-
即可。例如:
miui@fedora:~$ ls -l test.py
-rwxrwxr-x. 1 miui miui 40 2月16日 17:53 test.py
miui@fedora:~$ chmod -x test.py
miui@fedora:~$ ls -l test.py
-rw-rw-r--. 1 miui miui 40 2月16日 17:53 test.py
警告
注意:u+某权限,g+某权限,o+某权限可以直接写成+某权限;相反去掉权限也是这种操作方式,我们只需要把“+”替换成“-”。
文字权限修改方法比较直观易懂,数值设定法比较简洁迅速。这里演示数值设定法来修改文件的权限。操作如下:
miui@fedora:~$ ls -l test.py
-rw-rw-r--. 1 miui miui 40 2月16日 17:53 test.py
miui@fedora:~$ chmod 644 test.py
miui@fedora:~$ ls -l test.py
-rw-r--r--. 1 miui miui 40 2月16日 17:53 test.py
miui@fedora:~$ chmod -v 666 test.py
'test.py' 的模式已由 0644 (rw-r--r--) 更改为 0666 (rw-rw-rw-)
警告
注意:数值设定法使用的是权限符号对应的数值或者数值之和,三位数从左往右依次是用户主、用户组、其他用户。
我们还可以更改一个目录下面所有的文件和目录权限,我们需要使用-R选项。操作如下:
miui@fedora:~$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面 project test1 test2 test3 test4 test5 test6 test7 test.py
miui@fedora:~$ ls -l project/ project/src/
project/:
总计 8
drwxr-xr-x. 1 miui miui 36 2月19日 17:51 data
drwxr-xr-x. 1 miui miui 28 2月19日 17:50 src
-rw-r--r--. 1 miui miui 40 2月19日 21:29 test
-rw-r--r--. 1 miui miui 40 2月19日 21:30 test1
project/src/:
总计 0
drwxr-xr-x. 1 miui miui 18 2月19日 17:50 helpers
drwxr-xr-x. 1 miui miui 0 2月19日 17:50 main.py
miui@fedora:~$ chmod -vR 777 ./project/src/
'./project/src/' 的模式已由 0755 (rwxr-xr-x) 更改为 0777 (rwxrwxrwx)
'./project/src/main.py' 的模式已由 0755 (rwxr-xr-x) 更改为 0777 (rwxrwxrwx)
'./project/src/helpers' 的模式已由 0755 (rwxr-xr-x) 更改为 0777 (rwxrwxrwx)
'./project/src/helpers/helper.py' 的模式已由 0755 (rwxr-xr-x) 更改为 0777 (rwxrwxrwx)
miui@fedora:~$ ls -l project/ project/src/
project/:
总计 8
drwxr-xr-x. 1 miui miui 36 2月19日 17:51 data
drwxrwxrwx. 1 miui miui 28 2月19日 17:50 src
-rw-r--r--. 1 miui miui 40 2月19日 21:29 test
-rw-r--r--. 1 miui miui 40 2月19日 21:30 test1
project/src/:
总计 0
drwxrwxrwx. 1 miui miui 18 2月19日 17:50 helpers
drwxrwxrwx. 1 miui miui 0 2月19日 17:50 main.py
我们这里使用-vR
显示文件更改动作和详细信息,并且递归修改目录下面的文件权限,可以看见src整个目录和下面的子文件、子目录权限都被更改了。
修改属主和属组
在Linux操作系统中,每个对应的文件和目录有自己的属主和属组,只有文件的主人才有权限修改,或者是将权限移交给其他用户。改变文件的属主和属组需要使用chown
命令。利用chown将指定文件的拥用户可以是用户名或者UID,组可以是组名或者GID。
语法:
chown [选项] user[:group] [文件]
-c, --changes:效果类似"-v"参数,但仅回报更改的部分;
-f, --quite, --silent:不显示错误信息;
-h, --no-dereference:只对符号连接的文件作修改,而不更改其他任何相关文件;
-R, --recursive:递归处理,将指定目录下的所有文件及子目录一并处理;
-v, --version:显示指令执行过程;
--dereference:效果和"-h"参数相同;
请看如下操作:
miui@fedora:~$ ls -l test.py
-rw-rw-rw-. 1 miui miui 40 2月16日 17:53 test.py
miui@fedora:~$ chown root:root test.py
chown: 更改 'test.py' 的所有者: 不允许的操作
miui@fedora:~$ ls -l test.py
-rw-rw-rw-. 1 miui miui 40 2月16日 17:53 test.py
miui@fedora:~$ sudo chown -v root:root test.py
'test.py' 的所有者已从 miui:miui 更改为 root:root
miui@fedora:~$ ls -l test.py
-rw-rw-rw-. 1 root root 40 2月16日 17:53 test.py
我们使用chown命令将原来test.py文件的属主和属组从miui改成root,这个过程遇到了权限问题,我们只能用超级用户进行更改,因为我们所处的用户环境是基础用户环境,权限过低无法修改,如果处于root环境中,就不存在这个问题。不同的Linux发行版体现的效果不一样,某些发行版可以在低用户权限的状态实现属主和属组的更改。
如果我们只修改属主或者属组,我们可以进行以下操作:
miui@fedora:~$ ls -l test.py
-rw-rw-rw-. 1 root root 40 2月16日 17:53 test.py
miui@fedora:~$ sudo chown -v :miui test.py
'test.py' 的所有者已从 root:root 更改为 :miui
miui@fedora:~$ ls -l test.py
-rw-rw-rw-. 1 root miui 40 2月16日 17:53 test.py
miui@fedora:~$ sudo chown -v miui: test.py
'test.py' 的所有者已从 root:miui 更改为 miui:miui
miui@fedora:~$ ls -l test.py
-rw-rw-rw-. 1 miui miui 40 2月16日 17:53 test.py
我们置修改属组就只写冒号和后面的内容,修改属主就写前面的内容和冒号。
修改群组
我们还有一个专门用于修改属组的命令chgrp
,change group的缩写。
语法:
chgrp [选项] [目录]
-c, --changes:效果类似"-v"参数,但仅回报更改的部分;
-f, --quiet, --silent:不显示错误信息;
-h, --no-dereference:只对符号连接的文件作修改,而不是该其他任何相关文件;
-R, --recursive:递归处理,将指令目录下的所有文件及子目录一并处理;
-v, --verbose:显示指令执行过程;
案例如下:
chgrp -v 新的属组 文件名
自己去尝试吧。
复制目录
cp
命令可以理解为英文单词copy的缩写,其功能为复制文件或目录。cp命令可以将多个文件复制到一个具体的文件名或一个已经存在的目录下,也可以同时复制多个文件到一个指定的目录中。
语法:
cp [选项] [文件]
-a, --archive:复制文件和目录及其属性,包括权限、所有权和时间戳。相当于 -dR --preserve=all。
-b, --backup:在覆盖目标文件之前创建备份。
-d, --no-dereference:不跟随符号链接,而是复制链接本身。
-f, --force:如果目标文件已存在,则无条件覆盖它。
-i, --interactive:在覆盖已存在的文件之前提示用户确认。
-n, --no-clobber:不覆盖已存在的文件。如果目标文件存在,则跳过复制。
-p, --preserve:保留源文件的属性,包括权限和时间戳。
-r, --recursive:递归复制目录及其内容。
-R, --recursive:与 -r 相同,递归复制目录。
-s, --symbolic-link:创建符号链接而不是复制文件。
-u, --update:只复制源文件比目标文件新或目标文件不存在的文件。
-v, --verbose:详细模式,显示复制过程的详细信息。
-x, --one-file-system:留在当前文件系统内,不跨文件系统复制。
案例如下:
复制一个文件到另外一个目录,操作如下:
miui@fedora:~$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面 project test test1 test2 test3 test4 test5 test6 test7
miui@fedora:~$ cp test project/
miui@fedora:~$ ls project/
data src test
miui@fedora:~$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面 project test test1 test2 test3 test4 test5 test6 test7
可以看见我们成功实现了文件的复制。
复制目录和文件的时候还可以实现重命名,如下:
miui@fedora:~$ ls project/
data src test
miui@fedora:~$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面 project test test1 test2 test3 test4 test5 test6 test7
miui@fedora:~$ cp test project/test1
miui@fedora:~$ ls project/
data src test test1
miui@fedora:~$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面 project test test1 test2 test3 test4 test5 test6 test7
可以看见,project目录下面多了一个test1文件。
如果我们要复制整个目录怎么办?目录里面有很多的文件,我们如何操作?我们复制目录的时候在前面加上选项-r或者-R即可,请看下面案例:
miui@fedora:~$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面 project test test1 test2 test3 test4 test5 test6 test7
miui@fedora:~$ cp -r project/ test2/
miui@fedora:~$ ls test2/
project
miui@fedora:~$ ls test2/project/
data src test test1
移动与重命名
mv
命令是"move"单词的缩写,其功能大致和英文含义一样,可以移动文件或对其改名。
语法:
mv [选项]... [-T] 源文件 源文件
mv [选项]... [-T] 源文件 目录
mv [选项]... [-t] 目录 源文件
-i, --interactive:交互式操作,如果目标文件已存在,会提示用户是否覆盖。
-n, --no-clobber:不覆盖已存在的文件,如果目标文件已存在,则不会进行移动或重命名操作。
-v, --verbose:详细模式,显示操作的详细信息。
-f, --force:强制覆盖,如果目标文件已存在,则不提示直接覆盖。
-u, --update:只有在源文件比目标文件新或者目标文件不存在时才进行移动或重命名。
-b:在覆盖前创建备份,通常与-S选项一起使用来指定备份文件的扩展名。
-S, --Suffix=SUFFIx:替换常用的备份文件后缀
-t, --target-directory=目录:将所有<源文件>移动至指定的<目录>中
-T, --no-target-directory:将参数中所有<目标文件>部分视为普通文件
-z,--context:将目标文件的SELinux安全上下文设置为默认类型
为什么又三种语法?因为mv不仅可以移动文件,还可以重命名文件。
案例如下:
# 移动test文件到test3目录
miui@fedora:~$ ls project/
data src test test1
miui@fedora:~$ mv test test3/
miui@fedora:~$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面 project test1 test2 test3 test4 test5 test6 test7
我们还可以在移动文件的时候进行重命名操作,操作如下:
# 将test文件重命名成test.py移动到miui目录下
miui@fedora:~$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面 project test1 test2 test3 test4 test5 test6 test7
miui@fedora:~$ mv ./test3/test ./test.py
miui@fedora:~$ ls ./test3
miui@fedora:~$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面 project test1 test2 test3 test4 test5 test6 test7 test.py
还可以移动目录,同时也可以进行重命名操作,操作如下:
# 将test2目录下面的project目录移动到test3目录下面
miui@fedora:~$ ls ./test2
project
miui@fedora:~$ mv ./test2/project/ ./test3/
miui@fedora:~$ ls ./test2
miui@fedora:~$ ls ./test3
project
删除目录
删除目录有两个命令,一个是rm
,另外一个是rmdir
。二者的区别很好区分,rm命令可以删除文件、目录、链接;rmdir命令只能删除空目录。有一点需要注意,对于链接文件,rm只是删除连接本身,不能删除链接指向的原文件。
语法:
rm [选项] [文件]或者[目录]
-f 强制删除并且不提示
-i 删除前每次都要提示确认
-I 删除超过三个文件或者递归删除的时候需要提示一次并且确认,比-i提示更少
-r, -R 递归删除目录及其内容
-d, --dir 删除空目录
-v, --verbose 详细显示进行的步骤
--help 显示此帮助信息并退出
--version 显示版本信息并退出
请看下面的案例:
我们先多复制重命名一些文件,方便后面使用,因为还没有讲解文件创建,座椅这里用复制操作演示,操作如下:
miui@fedora:~$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面 project test1 test2 test3 test4 test5 test6 test7 test.py
miui@fedora:~$ cp test.py test.cpp
miui@fedora:~$ cp test.py test.php
miui@fedora:~$ cp test.py test.ts
miui@fedora:~$ cp test.py test.js
miui@fedora:~$ cp test.py test.jar
miui@fedora:~$ cp test.py test.java
miui@fedora:~$ cp test.py test.sh
miui@fedora:~$ ls
公共 视频 文档 音乐 project test2 test4 test6 test.cpp test.java test.php test.sh
模板 图片 下载 桌面 test1 test3 test5 test7 test.jar test.js test.py test.ts
我们尝试去参数test.ts文件,并且在删除的时候进行提示:

默认删除文件的时候没有提示,但是删除大目录和多文件的时候会有提示,特别是文件很多的那种。
我们还可以递归删除目录下面的文件和目录,并且不让它进行提示,操作如下:
miui@fedora:~$ ls
公共 视频 文档 音乐 project test2 test4 test6 test.cpp test.java test.php test.sh
模板 图片 下载 桌面 test1 test3 test5 test7 test.jar test.js test.py
miui@fedora:~$ cp test.cpp test7/
miui@fedora:~$ ls test7/
test.cpp
miui@fedora:~$ rm -rf test7/
miui@fedora:~$ ls
公共 视频 文档 音乐 project test2 test4 test6 test.jar test.js test.py
模板 图片 下载 桌面 test1 test3 test5 test.cpp test.java test.php test.sh
注意使用-rf是非常危险的操作,必须慎重,在Linux中一直流传着一个名梗:rm -rf /*
,前面我们说了/
的含义,这里使用这个操作是什么效果我不想说,因为我以前就尝试过,结果让人难绷,如果你想尝试这个操作,我建议你先使用虚拟机的快照功能做一个快照,方便恢复。至于rm -rf /*
的含义,你如果学懂了自然就读懂了是什么含义。

恢复是的是点击快照管理器,然后点击下面的“转到”选项即可恢复,注意备份和恢复有一段时间,请耐心等待,完成之后再进行其他操作。
如果你想删除当前目录下面的所有文件,那么可以使用rm -rf ./*
或者rm -rf *
为了安全考虑,建议你不要加上f。
接下来我们讲解rmdir。
语法:
rmdir [选项] [目录]
-p, --parents 删除目录及其父目录,只有当父目录为空时,才会被删除
-v, --verbose 详细模式,显示每个被删除的目录
-i 交互模式,在删除目录前进行确认
--ignore-fail-on-non-empty 忽略非空目录导致的失败
--help 显示此帮助信息并退出
--version 显示版本信息并退出
案例如下:
我们删除目录下面的test5目录,操作如下:
miui@fedora:~$ ls
公共 视频 文档 音乐 project test2 test4 test6 test.jar test.js test.py
模板 图片 下载 桌面 test1 test3 test5 test.cpp test.java test.php test.sh
miui@fedora:~$ rmdir test5
miui@fedora:~$ ls
公共 视频 文档 音乐 project test2 test4 test.cpp test.java test.php test.sh
模板 图片 下载 桌面 test1 test3 test6 test.jar test.js test.py
我们还可以删除指定的目录,操作如下:
miui@fedora:~$ ls
公共 视频 文档 音乐 project test2 test4 test.jar test.js test.py
模板 图片 下载 桌面 test1 test3 test.cpp test.java test.php test.sh
miui@fedora:~$ mkdir test6
miui@fedora:~$ mkdir test6/test5
miui@fedora:~$ ls test6
test5
miui@fedora:~$ rmdir -p test6/test5
miui@fedora:~$ ls
公共 视频 文档 音乐 project test2 test4 test.jar test.js test.py
模板 图片 下载 桌面 test1 test3 test.cpp test.java test.php test.sh
创建文件
我们如何创建一个空文件呢?我们有多种方式创建一个文件,没有指定好的方式。我们可以使用touch
创建一个空文件,可以使用echo
或者cat
来创建有文本的文件,也可以直接使用vim来编辑文件实现创建。vim前面在第三节命令行编辑的时候已经讲过了,这里讲解其他三中方式。
一般起来下echo和cat使用会比较多,并且会结合重定向、正则表达式一起使用。这里我们只讲基础用法,到后面的时候讲解进阶玩法。首先是touch。touch主要是用来更改文件属性的命令工具。
语法:
touch [选项] [文件名]
-a 更改访问时间
-m 更改修改时间
-c 不创建任何文件
-d 使用指定的日期和时间
-t 使用指定的时间戳
-r 使用参考文件的时间戳
请看案例:
创建一个main.py空文件,操作如下:
miui@fedora:~$ ls
公共 视频 文档 音乐 project test2 test4 test.jar test.js test.py
模板 图片 下载 桌面 test1 test3 test.cpp test.java test.php test.sh
miui@fedora:~$ touch main.py
miui@fedora:~$ ls
公共 视频 文档 音乐 main.py test1 test3 test.cpp test.java test.php test.sh
模板 图片 下载 桌面 project test2 test4 test.jar test.js test.py
miui@fedora:~$
这里我使用别名创建一个ll来替代ls -l选项,如下:
miui@fedora:~$ alias ll="ls -l"
更新已有文件的访问和修改时间,操作如下:
miui@fedora:~$ ll main.py
-rw-r--r--. 1 miui miui 0 2月20日 15:25 main.py
miui@fedora:~$ touch main.py
miui@fedora:~$ ll main.py
-rw-r--r--. 1 miui miui 0 2月20日 15:49 main.py
如果我们只更新访问时间,只需要在前面添加-a选项,操作如下:
miui@fedora:~$ touch -a main.py
miui@fedora:~$ ll main.py
-rw-r--r--. 1 miui miui 0 2月20日 15:49 main.py
使用特定日期和时间更新文件的时间戳,,操作如下:
miui@fedora:~$ ll main.py
-rw-r--r--. 1 miui miui 0 2月20日 15:49 main.py
miui@fedora:~$ touch -d "2024-01-01 12:00" main.py
miui@fedora:~$ ll main.py
-rw-r--r--. 1 miui miui 0 2024年 1月 1日 main.py
不创建新文件,仅更新已有文件的时间戳,使用如下命令即可:
touch -c main.py
文件查找
find
find
命令可以根据给定的路径和表达式查找的文件或目录。
find如不加任何参数,表示查找当前路径下的所有文件和目录,如果服务器负载比较高;尽量不要在高峰期使用find命令,find命令模糊搜索还是比较消耗系统资源的。
语法:
find [选项] [路径] [查找和搜索范围]
-name 按名称查找
-size 按大小查找
-user 按属性查找
-type 按类型查找
-iname 忽略大小写
-amin n:在过去 n 分钟内被读取过
-anewerfile:比文件file更晚被读取过的文件
-atimen:在过去n天内被读取过的文件
-cmin n:在过去 n 分钟内被修改过
-cnewer file:比文件 file 更新的文件
-ctimen:在过去n天内被修改过的文件
案例如下:
我们去查找/etc目录下面所有.conf结尾的配置文件

我们这里运用到了正则表达式,下一节我们再来学习用法,我们知道可以这样查找就可以。
查看/etc/sysconfig/network-scripts/目录下面所有大于 2k的配置文件:

注意这里的20k是小写,如果是大写就会出现错误。
查找当前目录下面所有的main.py文件:
miui@fedora:~$ find . -name main.py
./project/src/main.py
./test3/project/src/main.py
./main.py
查找当前目录下所有空文件(0字节):

locate
locate
命令用于查找符合条件的文档,他会去保存文档和目录名称的数据库内,查找合乎范本样式条件的文档或目录。locate命令类似于find-name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
语法:
locate [选项] [样式]或[命令]
-b, --basename 仅搜索路径名称中的文件名部分
-c, --count 打印匹配项的数量而不是匹配项本身
-d, --database DBPATH 在DBPATH中搜索文件
(默认是/var/lib/plocate/plocate.db)
-i, --ignore-case 不区分大小写地搜索
-l, --limit LIMIT 在达到LIMIT个匹配项后停止
-0, --null 用NUL而不是换行符分隔匹配项
-N, --literal 即使输出到终端也不对文件名加引号
-r, --regexp 将模式解释为基本正则表达式(速度慢)
--regex 将模式解释为扩展正则表达式(速度慢)
-w, --wholename 搜索整个路径名称(默认;参见 -b)
--help 打印此帮助信息
--version 打印版本信息
基本的使用方法:
miui@fedora:~$ locate main.py
/home/miui/project/src/main.py
/home/miui/test3/project/src/main.py
/usr/lib/python3.12/site-packages/dnf/cli/main.py
/usr/lib/python3.12/site-packages/gnome_browser_connector/main.py
/usr/lib/python3.12/site-packages/lvmdbusd/main.py
/usr/lib64/python3.12/lib2to3/main.py
/usr/lib64/python3.12/unittest/main.py
/usr/share/ibus/setup/main.py
/usr/share/ibus-anthy/engine/main.py
/usr/share/ibus-anthy/setup/main.py
/usr/share/ibus-hangul/setup/main.py
/usr/share/ibus-libzhuyin/setup/main.py
/usr/share/ibus-typing-booster/engine/main.py
/usr/share/ibus-typing-booster/setup/main.py
查找精确文件名:

忽略大小写:
miui@fedora:~$ locate -i main.py
/home/miui/project/src/main.py
/home/miui/test3/project/src/main.py
/usr/lib/python3.12/site-packages/dnf/cli/main.py
/usr/lib/python3.12/site-packages/gnome_browser_connector/main.py
/usr/lib/python3.12/site-packages/lvmdbusd/main.py
/usr/lib64/python3.12/lib2to3/main.py
/usr/lib64/python3.12/unittest/main.py
/usr/share/ibus/setup/main.py
/usr/share/ibus-anthy/engine/main.py
/usr/share/ibus-anthy/setup/main.py
/usr/share/ibus-hangul/setup/main.py
/usr/share/ibus-libzhuyin/setup/main.py
/usr/share/ibus-typing-booster/engine/main.py
/usr/share/ibus-typing-booster/setup/main.py
显示匹配的行数:
locate -c filename
限制输出数量:
miui@fedora:~$ locate -n 5 main.py
/home/miui/project/src/main.py
/home/miui/test3/project/src/main.py
/usr/lib/python3.12/site-packages/dnf/cli/main.py
/usr/lib/python3.12/site-packages/gnome_browser_connector/main.py
/usr/lib/python3.12/site-packages/lvmdbusd/main.py
命令查找
前面我们学了which
命令,这里我们讲另外一个文件查找的命令whereis
,whereis命令用于查找文件,该命令会在特定目录中查找符合条件的文件。注意:whereis命令只能用于程序名的搜索,而且只搜索二进制文件、man说明文件和源代码文件。
注
whereis命令查找速度非常快,因为它不是在磁盘中乱找,而是在一个数据库中查询;数据库是Linux系统自动创建的,包含有本地所有文件的信息,并且每天通过自动执行updatedb命令更新一次。正因为这样,whereis命令的搜索结果有时候会不准确,比如刚添加的文件可能搜不到,原因就是该数据库文件没有被更新。
语法:
whereis [选项] [命令名]
-b 查找二进制程序或命令
-B 从指定目录下查找二进制程序或命令
-m 查找 man 手册文件
-M 从指定目录下 查找man 手册文件
-s 只查找源代码文件
-S 从指定目录下 查找源代码文件
例如:显示ln命令的程序和man手册页的位置。
miui@fedora:~$ whereis ln
ln: /usr/bin/ln /usr/share/man/man1/ln.1.gz
显示ln命令的二进制程序的路径:
miui@fedora:~$ whereis -b ln
ln: /usr/bin/ln
显示ln命令的 man 手册页的路径:
miui@fedora:~$ whereis -m ln
ln: /usr/share/man/man1/ln.1.gz
文件打包与归档
文件归档也叫做打包、压缩是归档的一种形式之一。主要有如下常用命令:
- 压缩:zip,gzip,bzip,tar
- 解压:unzip,gunzip,bunzip,tar
zip解压缩
zip压缩命令语法如下:
zip [选项] [压缩文件] [被压缩的路径]
-f 新鲜化:仅更改的文件
-u 更新:仅更改或新文件
-d 删除压缩文件中的条目
-m 移动到压缩文件中(删除操作系统文件)
-r 递归进入目录
-j 放弃(不记录)目录名称
-0 仅存储
-l 将LF转换为CR LF(-ll将CR LF转换为LF)
-1 压缩更快
-9 压缩更好
-q 安静操作
-v 详细操作/打印版本信息
-c 添加单行注释
-z 添加压缩文件注释
-@ 从标准输入读取名称
-o 使压缩文件与最新条目一样旧
-x 排除以下名称
-i 仅包括以下名称
-F 修复压缩文件(-FF更努力尝试)
-D 不添加目录条目
-A 调整自解压可执行文件
-J 放弃压缩文件前缀(unzipsfx)
-T 测试压缩文件的完整性
-X 排除额外的文件属性
-y 将符号链接存储为链接而不是引用的文件
-e 加密
-n 不压缩这些后缀
-h2 显示更多帮助
案例如下:

我们可以利用相对路径和绝对路径来实现压缩,压缩的文件会在存放在当前目录。如果你已经创建了一个压缩文件,并想要改变它的位置,可以使用mv命令。
unzip解压语法如下:
unzip [选项] [压缩包] [解压路径]
-p 将文件解压到管道,无消息
-l 以短格式列出文件
-f 更新现有文件,不创建新文件
-t 测试压缩存档数据
-u 如果有必要则更新文件、创建文件
-z 仅显示存档注释
-v 详细列出/显示版本信息
-T 将存档时间戳更新为最新
-x 排除后面列出的文件(在xlist中)
-d 将文件解压到指定目录
修饰符:
-n 永远不覆盖现有文件
-q 安静模式(-qq表示更安静)
-o 不提示就覆盖文件
-a 自动转换任何文本文件
-j 丢弃路径(不创建目录)
-aa 将所有文件视为文本
-U 对所有非ASCII Unicode使用转义序列
-UU 忽略任何Unicode字段
-C 不区分大小写匹配文件名
-L 将(部分)名称转换为小写
-X 恢复UID/GID信息
-V 保留VMS版本号
-K 保留setuid/setgid/粘滞权限
-M 通过“more”分页器管道传输
-O CHARSET 为DOS、Windows和OS/2存档指定字符编码
-I CHARSET 为UNIX和其他存档指定字符编码
解压操作如下:
miui@fedora:~$ unzip -qo project.zip
miui@fedora:~$ unzip project.zip
Archive: project.zip
replace project/test? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
inflating: project/test
replace project/test1? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
inflating: project/test1
miui@fedora:~$
使用-qo选项就可以避免询问。
gz解压缩
gzip
是Linux 系统中经常用来对文件进行压缩和解压缩的命令,通过此命令压缩得到的新文件,其扩展名通常标记为“.gz”。值得注意的是,gzip命令只能用来压缩文件,不能压缩目录,即便指定了目录,也只能压缩目录内的所有文件,所以一般会和tar配合使用。
语法如下:
gzip [选项] [文件名]
-c,--stdout 输出到标准输出,保持原始文件不变
-d,--decompress 解压缩
-f,--force 强制覆盖输出文件并压缩链接
-h,--help 显示此帮助信息
-k,--keep 保留(不删除)输入文件
-l,--list 列出压缩文件内容
-L,--license 显示软件许可证
-n,--no-name 不保存或恢复原始名称和时间戳
-N,--name 保存或恢复原始名称和时间戳
-q,--quiet 抑制所有警告
-r,--recursive 对目录递归操作
--rsyncable 生成适合rsync的压缩包
-S,--suffix=SUF 在压缩文件上使用后缀SUF
--synchronous 同步输出(如果系统崩溃更安全,但速度较慢)
-t,--test 测试压缩文件的完整性
-v,--verbose 详细模式
-V,--version 显示版本号
-1,--fast 更快地压缩
-9,--best 更好地压缩
gunzip
是一个使用广泛的解压缩命令,它用于解压被gzip压缩过的文件(扩展名为.gz)。
语法如下:
gunzip [选项] [文件名]
-p 将文件解压到管道,无消息显示
-l 以短格式列出文件
-f 更新现有文件,不创建新文件
-t 测试压缩存档数据
-u 如果有必要则更新文件、创建文件
-z 仅显示存档注释
-v 详细列出/显示版本信息
-T 将存档时间戳更新为最新
-x 排除后面列出的文件(在xlist中)
-d 将文件解压到指定目录
修饰符:
-n 永远不覆盖现有文件
-q 安静模式(-qq表示更安静)
-o 不提示就覆盖文件
-a 自动转换任何文本文件
-j 丢弃路径(不创建目录)
-aa 将所有文件视为文本文件
-U 对所有非ASCII Unicode字符使用转义序列
-UU 忽略任何Unicode字段
-C 不区分大小写匹配文件名
-L 将(部分)名称转换为小写
-X 恢复UID/GID信息
-V 保留VMS版本号
-K 保留setuid/setgid/粘滞权限
-M 通过“more”分页器管道传输
-O CHARSET 为DOS、Windows和OS/2存档指定字符编码
-I CHARSET 为UNIX和其他存档指定字符编码
bz解压缩
bzip2
命令与 gzip 命令类似,只能对文件进行压缩(或解压缩),对于目录只能压缩(或解压缩)该目录及子目录下的所有文件。当执行压缩任务完成后,会生成一个以“.bz2”为后缀的压缩包。“.bz2”格式是Linux的另一种压缩格式,从理论上讲,“.bz2”格式的算法更先进、压缩比更好;而“.gz”格式相对来讲时间更快。
语法如下:
bzip2 [文件]
-h --help 打印此消息
-d --decompress 强制解压缩
-z --compress 强制压缩
-k --keep 保留(不删除)输入文件
-f --force 覆盖现有的输出文件
-t --test 测试压缩文件的完整性
-c --stdout 输出到标准输出
-q --quiet 抑制非关键错误消息
-v --verbose 详细输出(第二个 -v 会显示更多)
-L --license 显示软件版本和许可证
-V --version 显示软件版本和许可证
-s --small 使用较少的内存(最多2500k)
-1 .. -9 将块大小设置为100k .. 900k
--fast -1 的别名
--best -9 的别名
tar归档
tar命令可以为linux的文件和目录创建档案。利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。
首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。
为什么要区分这两个概念呢?这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。
语法:
tar [选项...] [FILE]...
常用选项:
tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.
tar -tvf archive.tar # List all files in archive.tar verbosely.
tar -xf archive.tar # Extract all files from archive.tar.
-c 表示创建一个新的归档文件。
-z 表示使用gzip进行压缩。
-v 表示在处理文件时显示详细信息。
-f 表示指定归档文件名。
-x 表示解压缩。
内容很多建议直接--help查看手册
创建一个tar归档并使用gzip压缩:

解压缩:
miui@fedora:~$ tar -xzvf project.tar.gz ./project
./project/
./project/src/
./project/src/main.py/
./project/src/helpers/
./project/src/helpers/helper.py/
./project/data/
./project/data/data.ison/
./project/data/data.json/
./project/test
./project/test1
miui@fedora:~$ ls
1.py 模板 图片 下载 桌面 Hello main.py project.tar.gz test1 test3 test.cpp test.java test.php test.sh
公共 视频 文档 音乐 hello main.cpp project project.zip test2 test4 test.jar test.js test.py
归档打包一个文件,请看操作:

解开归档的包,操作如下:

ACL访问控制列表
Linux ACL访问控制列表是一种用于控制文件和目录访问权限的机制。ACL可以用来控制文件和目录的读写执行权限,同时也可以针对特定的用户和组进行设置。传统的权限控制UGO(usr+group+other)具有一定的局限性。ACL在UGO权限的基础上为文件系统提供了一个额外的、更灵活的权限管理机制。
在Linux 中,ACL的实现主要通过extable文件系统扩展来进行的。extable文件系统扩展是Linux 内核中的一个文件系统扩展,它允许在 ext3 和ext4 文件系统上使用ACL。在 extable 文件系统扩展中,ACL被称为"access control entries"(访问控制条目,简称ACE)。

getfacl
getfacl
命令的作用是查看文件或目录的 ACL信息。对于要查看的每一个文件和目录,getfacl命令可以显示出文件的名称,用户所有者、组群所有者和访问控制列表(ACL)。
语法:
getfacl [选项] [目录或文件]
-a,--access:仅显示文件访问控制列表。
-d,--default:仅显示默认访问控制列表。
-c,--omit-header:不显示注释标题。
-e,--all-effective:打印所有有效权限。
-E,--no-effective:不打印有效权限。
-s,--skip-base:跳过仅有基本条目的文件。
-R,--recursive:递归进入子目录。
-L,--logical:逻辑遍历,跟随符号链接。
-P,--physical:物理遍历,不跟随符号链接。
-t,--tabular:使用表格输出格式。
-n,--numeric:打印数字形式的用户/组标识符。
--one-file-system:跳过不同文件系统上的文件。
-p,--absolute-names:不在路径名中去除开头的“/”。
-v,--version:打印版本信息并退出。
-h,--help:此帮助文本。
案例如下:
创建一个空文件acltest.txt,我们来查看它的ACL:

查看指定好的文件ACL,不显示注释信息

使用表格的形式查看指定文件的ACL,如下:

sefacl
setfacl
,即“设置文件访问控制列表”。该命令可以更精确的控制权限的分配,比如让某一个用户对某一个文件具有某种权限。ACL指文件的所有者、所属组、其他人的读/写/执行之外的特殊的权限,对于需要特殊权限的使用状况有一定帮助。如,某一个文件,不让单一的某个用户访问。
语法:
setfacl [选项] [规则] [文件]
-m,--modify = acl 修改文件(们)当前的访问控制列表(ACL)
-M,--modify - file = file 从文件中读取要修改的访问控制列表(ACL)项
-x,--remove = acl 从文件(们)的访问控制列表(ACL)中移除条目
-X,--remove - file = file 从文件中读取要移除的访问控制列表(ACL)项
-b,--remove - all 移除所有扩展访问控制列表(ACL)项
-k,--remove - default 移除默认访问控制列表(ACL)
--set = acl 设置文件(们)的访问控制列表(ACL),替换当前的访问控制列表(ACL)
--set - file = file 从文件中读取要设置的访问控制列表(ACL)项
--mask 重新计算有效权限掩码
-n,--no - mask 不重新计算有效权限掩码
-d,--default 操作应用于默认访问控制列表(ACL)
-R,--recursive 递归进入子目录
-L,--logical 逻辑遍历,跟随符号链接
-P,--physical 物理遍历,不跟随符号链接
--restore = file 恢复访问控制列表(ACL)(与'getfacl - R'相反)
--test 测试模式(访问控制列表(ACL)不会被修改)
-v,--version 打印版本信息并退出
-h,--help 此帮助文本
指定ACL模式规则,操作如下:
[d]u:uid:perms:为指定的用户(使用UID或用户名)设置ACL权限。
[d:]g:gid:perms:为指定的组(使用GID 或组名)设置ACL权限。
[d:]o:[:]perms:为其他用户设置ACL权限。
[d:]m:[:]perms:设置有效的访问掩码。
其中:
使用d:前缀时用于设置默认ACL(d:前缀仅能对目录设置)。
perms 为r、w、x、-或其组合
案例如下:
修改一个文件的ACL权限,为用户miui添加rwx权限:
miui@fedora:~$ getfacl acltest.txt
# file: acltest.txt
# owner: miui
# group: miui
user::rw-
group::r--
other::r--
miui@fedora:~$ setfacl -m u:miui:rwx acltest.txt
miui@fedora:~$ getfacl acltest.txt
# file: acltest.txt
# owner: miui
# group: miui
user::rw-
user:miui:rwx
group::r--
mask::rwx
other::r--
可以看见我们的文件权限发生了改变,miui用户拿到了读写执行的权限,并且修改了mask的权限值。
消除用户miui的ACL权限,操作如下:
miui@fedora:~$ getfacl acltest.txt
# file: acltest.txt
# owner: miui
# group: miui
user::rw-
user:miui:rwx
group::r--
mask::rwx
other::r--
miui@fedora:~$ setfacl -x u:miui acltest.txt
miui@fedora:~$ getfacl acltest.txt
# file: acltest.txt
# owner: miui
# group: miui
user::rw-
group::r--
mask::r--
other::r--
umask
前面我们提到的umask就是ACL安全机制的一种手段。
umask
是Linux系统中设置文件权限的掩码指令。当新文件被创建时,其最初的权限由文件创建掩码决定。用户每次注册进入系统的时候umask命令都被执行,并自动设置掩码mode来限制新文件的权限。我们可以通过再次执行umask命令来改变默认值,新的权限将会把旧的覆盖掉。当创建新文件或目录时,umask 值会从默认权限中减去,从而确定新对象的实际权限。
警告
注意:umask 是一个不同的概念,它是用来确定文件或目录在创建时默认的权限的。umask 设置了哪些权限不应该被赋予新创建的文件或目录。而ACL中的mask则是用来限制已经通过ACL设置的权限的。
常用的选项如下:
-p:输出的权限掩码可直接作为指令来执行
-S:以符号方式输出权限掩码
我们可以通过使用umask
命令来查看系统默认设置的权限掩码是多少。

我们如何计算当前创建的目录权限呢?
我们是通过权限符号来进行计算的,所有权限减去默认权限(umask的值022),取消掉相同的权限,留下的就是创建新的目录的权限。例如:
# 创建新目录的权限
drwxrwxrwx - -----w--w- = drwxr-xr-x(属主读写执行、属组读执行、其他用户读执行)
# 创建文件的权限
-rw-rw-rw- - -----w--w- = -rw-r--r--(属主读写、属组读、其他读)
这里我们讲解了文件权限、文件系统存在的用户和权限、umask权限掩码,接下来我们讲解如何修改我呢间和目录的权限。
我们还可以使用-S选项可以以字符的方式查看权限掩码,而不是数值,如:
miui@fedora:~$ umask -S
u=rwx,g=rx,o=rx
我们如何设置umask呢?
只需要在umask后面使用对应的数字值就行,四位数中,最后三位是权限值,也可只写最后三位:
umask 0077
umask 077
除了数值的设定方法,我们还可以使用字符的方式来进行设置,例如:
miui@fedora:~$ umask
0022
miui@fedora:~$ ls -l main.py
-rw-r--r--. 1 miui miui 0 2月20日 15:25 main.py
miui@fedora:~$ umask u=,g=w,o=rw
miui@fedora:~$ umask
0751
miui@fedora:~$ touch main.cpp
miui@fedora:~$ ls -l main.cpp
-----w-rw-. 1 miui miui 0 2月20日 15:43 main.cpp
我们更改之后,创建文件和目录的权限就被改变了,这个时候创建的目录和权限是如上最新的权限。
SUID权限
SUID特殊权限仅适用于可执行文件,所具有的功能是,只要用户对设有SUID的文件有执行权限,那么当用户执行此文件时,会以文件所有者的身份去执行此文件,一旦文件执行结束,身份的切换也随之消失。SUID赋予用户的是文件所有者的权限,而SGID赋予用户的是文件所属组的权限。
添加SUID权限chmodu+s路径
例如:
chmod u+s /usr/bin/password_changer
当普通用户执行password_changer时,他们会以root用户的身份执行该文件,从而能够更改自己的密码。
SGID权限
当一个目录被赋予SGID权限后,进入此目录的普通用户,其有效群组会变为该目录的所属群组,会使得用户在创建文件(或目录)时,该文件(或目录)的所属组将不再是用户的所属组,而使用的是目录的所属组。只有当普通用户对具有SGID权限的目录有rWX权限时,SGID的功能才能完全发挥作用。
添加SGID权限chmodg+s路径
例如:
chmod g+s /projekte/team_project
当团队成员进入这个目录并创建新文件时,这些文件会自动属于team_group组,而不是用户的默认组。
SBIT权限
StickyBIT,简称SBIT特殊权限,可意为粘着位、粘滞位、防删除位等。粘着位作用:如果一个目录赋予了粘着位,除了root用户可以删除所有文件,普通用户就算对该目录拥有w权限也只能删除自己创建的文件,不能删除其他用户创建的文件.
添加SBIT权限chmodo+t路径
例如:
chmod o+t /tmp
在/tmp目录中,只有文件的所有者或root用户可以删除或移动文件。普通用户即使有写权限,也只能删除或移动自己创建的文件。
项目实验一
本内容主要针对shell基础和目录文件结构等内容进行演练
场景:现在国内某公司购买了新的一批服务器,使用的是Fedora Linux系统,你现在是一名刚来的实习生,想要熟练掌握文件与目录的管理,为后续的服务配置做准备。
任务如下
- 查看当前工作目录
- 更改目录为[/],查看[/]下的目录文件
- 创建/data/httpd/html、/data/mariadb、/data/imgs、/data/document、/data/update等目录
- 查看/data/目录结构
- 在data目录下创建两个test1,2文件,拷贝这两个文件到/data/doucument目录下
- 删除这两个元始文件.最后查看目录的状态
- 把目录/data/document名字改为doc,把其中一个test1文件改为123.txt
- 删除另外一个test2文件
- 在/data/doc目录创建一大批test文件,然后蒋该目录打包再压缩[格式随意看个人喜好]
- 创建一个hello.sh文件,把我文件移动到/data/update下面,在data创建软链接文件hello
- 赋予hello.sh执行权限,但是其他成员不能拥有该权限,查看默认的权限掩码