目录
目录概念
目录是计算机文件系统中用于组织和存储文件和其他目录的一种重要概念。目录也被称为文件夹,它是文件系统中的一个重要组成部分,用于创建层次结构,方便用户管理和浏览文件。
树形目录
树形目录是一种 层次化 的文件组织结构,就像一棵倒置的树:
- 根目录(Root) 是整个目录结构的起点,通常记为
/
。 - 根目录下可以包含多个 子目录 和 文件,每个子目录下又可以包含更多的目录或文件,以此类推。
- 每个目录都可以看作是一个“节点”,通过“路径”连接起来,形成一棵树。
举例目录结构如下(见图):
示例路径:
/docs/report.txt
:表示在根目录下的docs
子目录中存在一个名为report.txt
的文件。/img/photos/summer.jpg
:表示文件summer.jpg
位于img/photos/
目录下。
这种结构具备以下特点:
- 层次清晰:便于用户查找和管理文件
- 路径唯一性:每个文件或目录都有唯一的绝对路径
- 支持相对路径:可使用
.
表示当前目录,..
表示上级目录
存储结构
在文件系统中,目录本质上就是一个特殊类型的文件,它的“内容”是一个个目录项(directory entry),用于记录当前目录下的文件和子目录的名字,以及它们对应的 inode 编号。
下图给出了目录的核心简化结构🧩:
目录文件内容(一个个目录项):
┌────────────────────────────┐
│ 文件名:. → inode 100 │ ← 当前目录
│ 文件名:.. → inode 99 │ ← 父目录
│ 文件名:a.txt → inode 123 │
│ 文件名:docs/ → inode 200 │
│ 文件名:img.jpg → inode 150 │
└────────────────────────────┘
每个目录项包括:
- 文件名(如 “a.txt”)
- 对应的 inode 编号(如 123),通过 inode 号查询 inode表 可以获取文件的元信息。
这些信息保存在磁盘上的 目录文件 中,文件系统通过这些记录来解析路径。
操作
树形目录不仅提供了结构化的存储方式,用户还可以通过命令行对 目录 和 文件其进行多种操作:
mkdir dir_name # 创建新目录
mv old_dir new_dir # 移动或重命名目录
rm -r dir_name # 递归删除目录及其内容
ls -l dir_name # 列出目录内容(详细信息)
touch filename # 创建一个空文件
rm filename # 删除文件
mv old new # 重命名或移动文件
cp src dest # 复制文件
cat filename # 显示文件内容
cd /path/to/dir # 进入指定目录(绝对路径)
cd .. # 返回上级目录
cd # 回到当前用户的主目录
pwd # 显示当前路径
文件链接
在 Linux 文件系统中,一个文件的“名字”其实只是目录项中的一个 链接(link)。文件的实际内容和元信息是保存在 inode 中的,而文件名只是“指向这个 inode 的引用”。基于这一设计,系统允许我们为同一个文件创建多个“名字”,这些名字就是所谓的文件链接。文件链接分为两种:硬链接 和 软链接,它们实现方式不同,行为也有所差异。
硬链接
硬链接(hard link)的本质,是在文件系统的目录存储结构中,为同一个索引节点(inode)创建多个目录项。这些目录项分别对应不同的文件名,但它们都指向同一个 inode,从而共享同一份文件数据。
在 Linux 中你可以使用命令 ln A D
创建 A
的硬链接 D
,它的含义是:在当前目录下创建一个名为 D
的新目录项,该目录项与 A
指向同一个 inode,从而实现两个文件名共享同一份文件内容。
$ echo "hello" > A
$ ln A B
$ ls -li A D
123456 -rw-r--r-- 2 user group 6 Jul 2 A
123456 -rw-r--r-- 2 user group 6 Jul 2 D
执行上述创建硬链接的命令后,系统中的目录会变为如下结构(简化):
因此,硬链接实现了 多个文件名访问同一个文件内容 的效果:
- 所有硬链接文件共享同一个 inode 号,指向同一个数据块,不会创建数据副本;
- 删除某一个硬链接,只是移除了对应的目录项,并减少 inode 的链接计数,不会影响其他链接;
- 只有当所有指向该 inode 的目录项都被删除时,该 inode 所占的数据块才会真正被释放;
- 出于文件系统一致性考虑,硬链接不能用于目录,以防目录结构形成环;
- 硬链接仅限于同一个文件系统内部,不能跨越挂载点或磁盘分区。
软链接
软链接(也叫做 符号链接,symbolic link)的本质,是在文件系统中 创建一个特殊类型的文件,其内容是 指向目标文件路径的字符串。软链接自身拥有独立的 inode 和数据块,但并不直接指向目标文件的 inode,而是通过路径进行间接访问。
在 Linux 中你可以使用命令 ln -s A L
创建 A
的软链接 L
,它的含义是:在当前目录下创建一个名为 L
的链接文件,其内容是 "A"
,即指向文件 A
的路径。
$ echo "hello" > A
$ ln -s A L
$ ls -li A L
123456 -rw-r--r-- 1 user group 6 Jul 2 A
234567 lrwxrwxrwx 1 user group 1 Jul 2 L -> A
执行上述创建软链接的命令后,系统中的目录结构会变为如下形式(简化):
因此,软链接实现了 路径级别的引用关系,其行为特性如下:
- 软链接是一个独立的文件,拥有自己的 inode 和数据块,数据块中存储的是目标路径(如
"A"
); - 删除原文件后,软链接不会失效为独立文件,但会变成悬挂链接(dangling link),无法再访问目标内容;
- 软链接 可以跨文件系统使用,也可以链接目录,灵活性更高;
- 访问软链接时,系统会先读取其路径内容,再根据该路径查找目标文件;
- 文件属性显示中,软链接使用
l
类型标识,显示类似L -> A
的引用关系。