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
cd [dir]
切换目录,进入 [dir]
目录
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 编号
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
格式
选项 |
作用 |
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
以自然语言展示)、修改时间、文件名。
符号 |
含义 |
- |
普通文件(例如文本文件、二进制文件等) |
d |
目录 |
l |
符号链接(软链接) |
c |
字符设备文件 |
b |
块设备文件 |
p |
命名管道(FIFO) |
s |
套接字文件 |
- 访问模式:所有者权限(
1, 2, 3
)、所属组权限(4, 5, 6
)、其他用户权限
符号 |
含义 |
r - |
第一个字符:读权限,r 表示可读,- 表示不可读 |
w - |
第二个字符:写权限,w 表示可写,- 表示不可写 |
x - |
第三个字符:执行权限,x 表示可执行,- 表示不可执行 |
4.4 tree 查看目录树
先在 Ubuntu 上安装 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
- 同一目录下不可同名
- 缺省
-p
--parents
时,父目录不存在时不可以创建子目录
- 目录可以理解为文件夹
1 2 3 4
| mkdir dir2/dir3
mkdir -p dir2/dir3
|
5.2 删除目录 rmdir
- 仅允许删除空目录,如果有文件则无法删除
- 对于一连串的目录,例如
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 -p dir1
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
|
复制目录需要 -r
递归复制。
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
| mv [OPTION] SOURCE DEST
mv [OPTION] SOURCE... DIRECTORY
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
| mv old_file.txt new_file.txt
|
- 移动文件到目录
1
| mv file.txt /target/dir/
|
- 覆盖前备份
1 2
| mv -b file.txt /backup/ mv -b -S .bak file.txt
|
- 批量移动
5.5 删除 rm
格式
1
| rm [OPTION]... [FILE]...
|
选项 |
说明 |
-i |
每次删除前询问确认 |
-f |
强制删除(不询问,忽略错误) |
-R -r --recursive |
递归删除目录及其子内容 |
-d --dir |
删除空目录 |
-v --verbose |
显示详细操作过程 |
- 删除文件(强制)
- 递归删除目录
- 删除多个文件
6 Linux 目录结构
由 DeepSeek 整理
6.1 核心目录
6.1.1 根目录(/)
整个文件系统树的根,包含了许多子目录
6.1.2 基础功能目录
目录 |
功能说明 |
重要特性 |
/bin |
基础执行程序 |
包含ls 、cp 等基础命令,单用户模式可用 |
/sbin |
系统管理程序 |
fdisk 、ifconfig 等管理员专用命令 |
/lib |
共享库文件 |
为 /bin 和 /sbin 提供运行依赖 |
/dev |
设备文件 |
由udev 管理,如/dev/sda (磁盘设备) |
6.1.3 系统配置目录
目录 |
核心内容 |
典型文件 |
/etc |
系统级配置文件 |
passwd 、fstab 、ssh/ |
/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/ |