Linux 文件系统

Linux 文件系统:路径名、目录 (pwd, cd) 、文件系统组织方式 (inode) 、文件和目录查看 (touch, ls, tree) 、文件和目录操作 (mkdir, rmdir, cp, mv, rm) 和 Linux 的目录结构。

1 路径名和路径名解析

相关命令:dirname basename realpath

文件系统以一颗目录树的形式来组织:

  • 根节点称为根 root 目录,用 / 来表示
  • 目录树中的名字只需在其所在目录中唯一

1.1 路径名

路径以 / 分隔,分为相对路径和绝对路径:

  • 绝对路径:从根目录开始,以 / 分割各级目录,例如:/home/User/Documents/example.txt
  • 相对路径:从当前目录开始,只包含当前目录以下的目录名,例如:如果位于 /home/User 则相对路径为 Documents/example.txt 或者 ./Documents/example.txt

... 是特殊的目录,所有目录下都有这两个目录,. 指代当前目录,.. 指代上一级目录。特别的,根目录的上一级目录为自身。

1.2 路径解析

命令 含义
dirname ... 返回 ... 所在目录的绝对路径
basename ... 返回路径 ... 的文件名,即最后一个名字
realpath [options] ... 返回路径名解析后的绝对路径
1
2
$ dirname /home/iskage/docs/example.txt
/home/iskage/docs
1
2
$ basename /home/iskage/docs/example.txt
example.txt
1
2
3
4
5
$ realpath -e example.txt
/home/iskage/docs/example.txt

$ realpath -m wrong.txt
/home/iskage/docs/wrong.txt

realpath 返回绝对路径,缺省参数默认为 -e

realpath 参数 要求
-e 检查目录是否存在,不要去文件存在,但检查文件夹存在性
-m 不检查目录是否存在

2 改变目录和波浪号扩展

相关命令 pwd cd ~..

2.1 改变目录 pwd, cd

  • pwd 检查当前目录
1
2
$ pwd
/home/iskage/docs
  • cd [dir] 切换目录,进入 [dir] 目录

cd 留空进入当前用户主目录,即 ~

1
2
~/docs$ cd
~$

cd - 表示工作目录设置为先前的工作目录,可在两个目录中切换:例如在 A 目录使用 cd - ,然后进入目录 B 随后使用 cd - 返回 A 目录,再次使用返回 B 目录

1
2
3
4
5
6
7
8
9
~$ cd -
/home/iskage

~$ cd docs
~/docs

~/docs$ cd -
/home/iskage
~$

2.2 ~ 扩展

  • 单独的波浪号 ~ 表示当前用户的主目录,而 ~user 表示用户 user 的主目录
1
2
cd ~user
进入 user 的主目录,一般为 /home/user

追踪 bash 的命令和返回,可以设置 set -x 打开追踪功能;set +x 关闭追踪功能。

1
2
3
4
5
6
7
set -x
cd ~iskage
+ cd /home/iskage

cd ~user
+ cd '~user'
bash: cd: ~user: No such file or directory

3 文件系统的组织方式

3.1 文件系统的组织

文件系统由 2 部分组成:

  • 保存文件相关的元信息的索引节点 inode(index node)
  • 实际存储数据的数据块

索引节点 inode 包含:拥有者的 UID 和 GID(用户和用户组);文件长度;类型和权限;访问、修改和状态改变时间;引用次数;数据块编号列表。

实际存储数据的数据块包含:对于普通文件,数据块保存实际的内容;对于目录文件,数据块保存的是该目录包含的子目录和文件所对应的目录项。

目录项:每个目录包含子目录和文件的目录项,目录项保存了其对应的文件(包括子目录)的名字以及该文件对应的 inode 编号

文件结构:索引节点和数据块
  • ls -i 可以产看索引节点
1
2
ls -i
793134 docs

3.2 查看磁盘使用情况 df

格式

1
2
3
4
5
6
7
8
9
df [options] [file]

-h : 以自然语言展示 1k=1024
-H , --si : 以自然语言展示 1k=1000
-i , --inodes : 查看节点类型
-T , --print-type : 显示文件系统类型
-t , --type=TYPE : 仅仅显示相应类型的文件系统信息,例如 --type=ext4 或 -t ext4

file : 缺省,则展示当前所在目录属于的文件系统
1
2
3
4
5
6
7
8
9
df -Th

Filesystem Type Size Used Avail Use% Mounted on
tmpfs tmpfs 168M 1.1M 167M 1% /run
/dev/vda3 ext4 40G 3.8G 34G 11% /
tmpfs tmpfs 837M 0 837M 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/vda2 vfat 197M 6.1M 191M 4% /boot/efi
tmpfs tmpfs 168M 4.0K 168M 1% /run/user/0
1
2
3
4
5
6
7
8
9
df -iT --si

Filesystem Type Inodes IUsed IFree IUse% Mounted on
tmpfs tmpfs 215k 729 214k 1% /run
/dev/vda3 ext4 2.7M 100k 2.6M 4% /
tmpfs tmpfs 215k 2 215k 1% /dev/shm
tmpfs tmpfs 215k 3 215k 1% /run/lock
/dev/vda2 vfat 0 0 0 - /boot/efi
tmpfs tmpfs 43k 26 43k 1% /run/user/0

vda2 表示位于第 1 个磁盘的第 2 区(abc表示磁盘号,123表示分区)

3.3 查看文件使用的空间情况 du

格式

1
2
3
4
5
6
7
8
du [options] [file]

-c , --total : 最后显示加和总使用空间
-s , --summarize : 仅仅显示每个参数的总使用情况
-d , --max-depth=N : 递归展示子目录的深度,N=0 表示不递归
-B SIZE : 设置展示的单位为 SIZE,缺省默认为 1k bit
-h : 自然语言展示 1k=1024
--si : 与 -h 相同,但 1k=1000

因为 du -s 表示只展示 file 自己的总使用情况,故等价于 du -d 0 深度为 0

1
2
3
4
5
du --si -d 1 -c ./snap

17k ./snap/lxd
21k ./snap
21k total

3.4 查看文件类型 file

file 指令会查看文件的根本类型,而不是根据拓展名查看。

1
2
3
4
5
file a.py
a.py: ASCII text

file -i a.py
a.py: text/plain; charset=us-ascii

-i , --mime 输出 MIME 头部。

4 文件名和目录查看

4.1 touch 修改时间

touch file 文件存在时改变时间,不存在时创建文件。每个文件的时间包括:

  • 修改时间 mtime :修改文件内容时更新
  • 访问时间 atime :读文件操作时更新的时间
  • 状态改变时间 ctime :文件内容或元信息(如权限/名字/时间等)改变时更新,用户无法改变,而是内核自动更新

格式

1
2
3
4
5
6
7
touch [option] file

-m : 仅改变修改时间
-a : 仅改变访问时间
-t time : 指定时间为 time 格式为 [[CC]YY]MMDDhhmm[.ss]
例如 [[20]25]03070938[.11] 表示2025年3月7日9时38分11秒
-r , --reference=BASE : 使用文件 BASE 的时间

4.2 文件名格式

  • Linux 系统的文件名(包括目录等)区分大小写。
  • 文件名不能命名为 ... ,也不能包含 /NULL 字符(ASCII 码为 0 的字符),除此之外可以包含任何字符。
  • 可以使用后缀,不过并不强制要求。
  • 一般规范为:使用字母、数字、 .-_ 组成。且避免使用 - 开头,也不使用空格。
  • 如果出现歧义,可以使用 ""'' 包裹起这些文件名。

4.3 列目录命令 ls

格式

1
ls [options] [file]
选项 作用
ls 缺省 列出当前目录不包含 . 开头的隐藏文件
ls -a 列出所有目录,包含隐藏目录和 ...
ls -A 列出所有目录,包含隐藏目录,但不包含 ...
ls -F 添加文件类型指示,例如文件夹 snap 表现为 snap/
ls -l 长列表形式展示
ls -d ls --directory 显示当前目录的信息,一般和 -l 联合使用
ls -i ls --inode 显示 inode 编号
ls -R ls -recursive 递归展示目录和子目录内容
ls -r ls --reverse 反向排序展示目录
ls -X ls --sort=extension 按照后缀排序,没有后缀的优先
ls -S ls --sort=size 按照文件大小排序,默认从大到小
ls -t ls --sort=time 按照时间排序,默认从新到旧
ls -U ls --sort=none 不排序

对于 ls -l 列出的信息,里面分别包含:文件类型、访问模式、引用计数、拥有者用户、用户组、文件大小(-h 以自然语言展示)、修改时间、文件名。

ls -l 文件信息
  • 文件类型
符号 含义
- 普通文件(例如文本文件、二进制文件等)
d 目录
l 符号链接(软链接)
c 字符设备文件
b 块设备文件
p 命名管道(FIFO)
s 套接字文件
  • 访问模式:所有者权限(1, 2, 3)、所属组权限(4, 5, 6)、其他用户权限
符号 含义
r - 第一个字符:读权限,r 表示可读,- 表示不可读
w - 第二个字符:写权限,w 表示可写,- 表示不可写
x - 第三个字符:执行权限,x 表示可执行,- 表示不可执行

4.4 tree 查看目录树

先在 Ubuntu 上安装 tree

1
sudo apt install tree

然后可以使用 tree 命令以树的形式递归展示目录结构:

选项 含义
tree 显示当前目录及其子目录的树状结构
tree -d 仅显示目录,不显示文件
tree -L n 限制显示的目录层级深度为 n。例如,tree -L 2 显示两层目录
tree -a 显示所有文件和目录,包括隐藏文件(以 . 开头的文件)
tree -f 显示文件的完整路径
tree -p 显示文件和目录的权限
tree -s 显示文件和目录的大小(以字节为单位)
tree -h 以人类可读的格式显示文件和目录的大小(例如 KB、MB)
tree -D 显示文件和目录的最后修改时间
tree -I pattern 排除符合指定模式的文件。例如,tree -I "*.txt" 排除所有 .txt 文件
tree -o filename 将输出保存到指定文件中。例如,tree -o output.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
~$ tree

.
├── a.py
├── file1
├── file2
├── file3
└── snap
└── lxd
├── 22923
├── 31333
├── common
└── current -> 31333

5 文件和目录操作

5.1 创建目录 mkdir

1
mkdir [-p] directory
  • 同一目录下不可同名
  • 缺省 -p --parents 时,父目录不存在时不可以创建子目录
  • 目录可以理解为文件夹
1
mkdir dir1
1
2
3
4
mkdir dir2/dir3
# mkdir: cannot create directory ‘dir2/dir3’: No such file or directory

mkdir -p dir2/dir3

5.2 删除目录 rmdir

1
rmdir [-p] directory
  • 仅允许删除空目录,如果有文件则无法删除
  • 对于一连串的目录,例如 dir1/dir2/dir3 其中 dir3 为空目录。可以使用 rmdir -p dir1/dir2/dir3 删除。这一步等价于先删除 dir1 然后 dir2 dir3 ,即 rmdir dir1/dir2/dir3 && rmdir dir1/dir2 && rmdir dir1
  • 如果希望递归删除节点以下所有内容,可以使用 rm -R
1
2
3
4
5
6
7
rmdir dir1
# rmdir: failed to remove 'dir1': Directory not empty
rmdir -p dir1
# rmdir: failed to remove 'dir1': Directory not empty

# 正确
rmdir -p dir1/dir2/dir3

5.3 复制文件和目录 cp

5.3.1 复制和创建新文件

1
cp [options] SOURCE DESTINATION
  • SOURCE:要复制的文件或目录。
  • DESTINATION:目标文件或目录。如果 DESTINATION 是一个目录,则会将 SOURCE 复制到该目录中;如果 DESTINATION 是一个文件名,则会将 SOURCE 复制并重命名为 DESTINATION
1
2
cp ./dir1/file file_copy
# 将 ./dir1/ 下的 file 文件复制一份到当前目录的 file_copy 文件

复制目录需要 -r 递归复制。

1
cp -r ./dir1/ dir1_copy

5.3.2 备份和覆盖

如果要复制的位置存在相同的文件名,权限允许(即可以写 w)时缺省会直接覆盖。权限不允许(没有写权限)时会报 Permission denied 错。

1
2
3
cp -f : 强制覆盖
cp -i : 覆盖前询问用户
cp -b : 覆盖前保留备份,以原文件名加 ~

5.3.3 递归复制目录

1
2
cp -r : 递归复制目录和子目录
cp -a : 递归复制目录和子目录,保留原文件的属性

如果目标目录存在,则将复制后的目录直接放在目标目录下

如果目标目录不存在,则创建新目录,将被复制的目录第一个父目录后的所有子目录放在目标目录下

1
2
3
4
5
.
├── dir1
│   └── dir2
│   └── dir3
└── tmp1
  • 存在目标目录
1
2
3
4
5
6
7
8
9
cp -r dir1 ./tmp1
.
├── dir1
│   └── dir2
│   └── dir3
└── tmp1
└── dir1
└── dir2
└── dir3
  • 但如果不存在目标目录
1
2
3
4
5
6
7
8
9
10
11
12
cp -r dir1 ./tmp2
.
├── dir1
│   └── dir2
│   └── dir3
├── tmp1
│   └── dir1
│   └── dir2
│   └── dir3
└── tmp2
└── dir2
└── dir3

5.4 移动或重命名 mv

格式

1
2
3
4
5
6
7
8
# 格式1:移动并重命名
mv [OPTION] SOURCE DEST

# 格式2:移动到目录(目录必须存在)
mv [OPTION] SOURCE... DIRECTORY

# 格式3:指定目标目录(与格式2等价)
mv [OPTION] -t DIRECTORY SOURCE...
  • DEST/ 结尾,强制使用格式2(目录必须存在,否则报错)
  • 若目标位置存在同名文件/目录,默认直接覆盖
选项 说明
-t --target-directory=... 指定目标目录
-i --interactive 覆盖前询问确认
-f --force 强制覆盖(不询问)
-n --no-clobber 禁止覆盖已有文件
-b 覆盖前备份(默认添加 ~ 后缀)
-S SUFFIX --suffix=SUFFIX 自定义备份文件后缀(需配合 -b
-u --update 仅当目标文件不存在或比源文件旧时移动
-v --verbose 显示详细操作过程
  1. 重命名文件
1
mv old_file.txt new_file.txt
  1. 移动文件到目录
1
mv file.txt /target/dir/
  1. 覆盖前备份
1
2
mv -b file.txt /backup/  # 生成 file.txt~
mv -b -S .bak file.txt # 自定义备份后缀 生成 file.txt.bak
  1. 批量移动
1
mv *.jpg /photos/ -v  # -v 显示详细操作

5.5 删除 rm

格式

1
rm [OPTION]... [FILE]...
  • 直接删除文件(不询问)

  • 目录删除,需配合 -R/-r 选项删除非空目录;使用 -d 选项可删除空目录

选项 说明
-i 每次删除前询问确认
-f 强制删除(不询问,忽略错误)
-R -r --recursive 递归删除目录及其子内容
-d --dir 删除空目录
-v --verbose 显示详细操作过程
  1. 删除文件(强制)
1
rm -f file.txt
  1. 递归删除目录
1
rm -r directory/
  1. 删除多个文件
1
rm -i *.log  # -i 每次删除都询问是否进行

6 Linux 目录结构

DeepSeek 整理

6.1 核心目录

6.1.1 根目录(/)

整个文件系统树的根,包含了许多子目录

6.1.2 基础功能目录

目录 功能说明 重要特性
/bin 基础执行程序 包含lscp等基础命令,单用户模式可用
/sbin 系统管理程序 fdiskifconfig等管理员专用命令
/lib 共享库文件 /bin/sbin 提供运行依赖
/dev 设备文件 udev管理,如/dev/sda(磁盘设备)

6.1.3 系统配置目录

目录 核心内容 典型文件
/etc 系统级配置文件 passwdfstabssh/
/boot 启动相关文件 grub/vmlinuz(内核文件)

6.1.4 用户相关目录

目录 功能说明 用户权限
/home 用户主目录 ~/ 指向用户专属目录
/root 管理员主目录 独立于普通用户的根 /home 结构

6.1.5 存储相关目录

目录 挂载类型 典型用途
/media 可移动存储 U盘、光盘自动挂载点
/mnt 临时挂载点 手动挂载硬盘/NFS

6.2 特殊用途目录

6.2.1 运行时数据

目录 数据特性 典型内容
/var 动态可变数据 log/mail/spool/
/run 运行时信息 PID文件、/var/run符号链接

6.2.2 临时空间

目录 生命周期 权限控制
/tmp 临时文件 用户可创建,仅创建者可删除
/lost+found 文件恢复 fsck修复后的残留文件

6.2.3 内核与硬件

目录 信息类型 访问方式
/proc 进程与内核数据 虚拟文件系统,实时读取(如cpuinfo
/sys 硬件层级信息 设备驱动、电源管理等

6.3. 资源存储目录

6.3.1 静态资源库

目录 资源类型 典型结构
/usr 只读共享资源 bin/lib/share/(文档)
/opt 第三方软件 独立软件包(如Oracle)

6.3.2 服务数据

目录 服务类型 典型应用
/srv 本地服务数据 www/(网站数据)、ftp/