Linux 文件系统天花板:FHS全套文件命令速通
作为开源操作系统的标杆,Linux 凭借其灵活的定制性和强大的稳定性,成为服务器端、嵌入式设备及开发者工作站的首选。但正是这种高度的灵活性,也带来了一个潜在问题:若每个用户都按照自己的习惯随意创建目录、存放文件,不同系统之间的兼容性将大打折扣。为解决这一痛点,FHS(Filesystem Hierarchy Standard,文件系统层次标准)应运而生,为 Linux 文件系统目录结构制定了统一规范,让不同发行版的 Linux 系统具备了一致的文件组织逻辑。
与此同时,命令行作为 Linux 最核心、最高效的操作方式,掌握其文件管理技巧,是从 Linux 新手进阶为运维高手的必经之路。本文将结合 FHS 标准,全面拆解 Linux 目录结构逻辑,并详细讲解常用命令行文件管理工具的实操技巧,助力大家高效驾驭 Linux 系统。
文章目录
一、文件系统层次结构:Linux 文件系统的“通用语言”
Linux遵循开源协议,所以任何人都可以根据Linux的核心代码制作和发行版本。如果每个人都按自己的喜好,在/目录下创建目录、存放文件,将导致其他人无法快速使用他人的linux系统。为避免这样的情况,FHS就应运而生,对linux文件系统目录结构进行规范化。
FHS(Filesystem Hierarchy Standard)采用树形结构组织文件,定义了系统中每个区域的用途、所需要的最小构成的文件和目录,同时还给出了例外处理与矛盾处理。
FHS定义了两层规范:
-
定义了 / 下面的各个目录应该要放什么文件数据。例如/etc应该要放置设置文件,/bin与/sbin则应该要放置可执行文件等等。
-
针对/usr及/var这两个目录的子目录来定义。例如/var/log放置系统登录文件、/usr/share放置共享数据等等。
| 位置 | 全称/核心含义 |
|---|---|
| /usr | 系统安装的软件、共享的库。重要的子目录有:/usr/bin: 用户命令。/usr/sbin: 系统管理命令。 /usr/lib、/usr/lib64:应用程序可调用的通用库文件。 /usr/local: 本地自定义软件。 |
| /etc | 系统配置文件。 |
| /var | variable,系统可变数据,在系统启动之间保持永久性,如数据库、 缓存目录、日志文件、打印机后台处理文档和网站内容。 |
| /run | 自本次系统启动以来运行中的进程的运行数据,包括进程ID文件和锁定文件,等等。此目录中的内容在重启时重新创建。此目录合并了早期版本的Linux 中的/var/run和/var/lock。 |
| /home | 主目录是普通用户存储其个人数据和配置文件的位置。 每个用户有自己的位置,例如 /home/csh。 |
| /root | 管理员root的主目录。 |
| /tmp | 供临时文件使用的全局可写空间。 10天内未访问、未更改或未修改的文件将自动从该目录中删除。 还有一个临时目录/var/tmp,该目录中的文件如果在30天内未曾访问、更改或修改过, 将被自动删除。 |
| /boot | 开机启动过程所需的文件。 |
| /dev | device,包含特殊的设备文件,供系统用于访问硬件。 |
二、文件路径导航:Linux 系统的“定位神器”
导航路径 cd 和 pwd
常见路径说明:
- 绝对路径:以根(/)开头的路径,用于指定文件的确切位置。
- 当前工作路径:当前所处的位置。
- 相对路径:不是以根(/)开头的路径,相对当前工作目录的路径。
(1)pwd:查看当前工作目录
pwd(Print Working Directory)命令用于显示当前所处的工作目录,帮助我们明确自身在文件系统中的位置,避免操作时出现路径错误。
# 查看当前工作目录
[csh@centos7 ~]$ pwd
/home/csh
(2)cd:切换工作目录
cd(Change Directory)命令用于切换工作目录,是日常操作中使用最频繁的命令之一,支持绝对路径、相对路径及快捷切换方式,满足不同场景的切换需求。
# 1. 绝对路径切换
[csh@centos7 ~]$ cd /usr/bin
[csh@centos7 bin]$ pwd
/usr/bin
# 2. 相对路径切换(当前目录为/usr/bin,切换到/usr/share/doc)
[csh@centos7 bin]$ cd ../share/doc
[csh@centos7 doc]$ pwd
/usr/share/doc
# 3. 快捷切换:返回上一次所在目录
[csh@centos7 doc]$ cd -
/usr/bin
# 4. 快捷切换:回到当前用户家目录(两种方式均可)
[csh@centos7 bin]$ cd
# 或
[csh@centos7 bin]$ cd ~
[csh@centos7 ~]$ pwd
/home/laoma
# 5. 快捷切换:回到父目录(上一级目录)
[csh@centos7 ~]$ cd ..
[csh@centos7 home]$ pwd
/home
(3)ls:列出目录内容
ls(List)命令用于列出指定目录下的文件和子目录,通过搭配不同选项,可实现文件详细信息查看、递归检索、排序等功能,是文件检索的核心命令。
# 1. 基础用法:列出当前目录下的文件和目录
[csh@centos7 ~]$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面
# 2. -1(数字1):单列格式展示,清晰直观
[csh@centos7 ~]$ ls -1
公共
模板
视频
图片
文档
下载
音乐
桌面
# 3. -R:递归查看子目录内容,展示目录完整结构
[csh@centos7 ~]$ ls -R /etc/yum
/etc/yum:
fssnap.d pluginconf.d protected.d vars version-groups.conf
/etc/yum/fssnap.d:
/etc/yum/pluginconf.d:
fastestmirror.conf langpacks.conf
# 4. -l:长列表格式,查看文件详细信息(权限、所有者、大小、修改时间等)
[csh@centos7 ~]$ ls -l /etc/hosts
-rw-r--r--. 1 root root 197 11月 3 14:35 /etc/hosts
# 5. -r:反向排序,按文件名从后往前排列
[csh@centos7 ~]$ ls -rl
总用量 0
-rw-rw-r--. 1 csh csh 0 11月 3 17:18 hello
-rw-rw-r--. 1 csh csh 0 11月 3 17:18 file-2
# 6. -t:按修改时间排序,最新修改的文件排在最前
[csh@centos7 ~]$ ls -tl
总用量 0
-rw-rw-r--. 1 csh csh 0 11月 3 17:22 hello
-rw-rw-r--. 1 csh csh 0 11月 3 17:18 abc
# 7. -d:只查看目录本身信息,不列出目录内的文件
[csh@centos7 ~]$ ls -ld /etc/yum
drwxr-xr-x. 6 root root 100 12月 13 10:42 /etc/yum
(4)tree:树形展示目录结构
tree 命令以树形格式直观展示目录的层级结构,便于我们快速了解目录的组织方式,默认未安装,可通过 yum 命令安装(需 root 权限)。
# 安装 tree 工具(CentOS 系统)
[root@centos7 ~]# yum install -y tree
# 树形展示/etc/yum目录结构
[csh@centos7 ~]$ tree /etc/yum
/etc/yum
├── fssnap.d
├── pluginconf.d
│ ├── fastestmirror.conf
│ └── langpacks.conf
├── protected.d
│ └── systemd.conf
├── vars
│ ├── contentdir
│ └── infra
└── version-groups.conf
4 directories, 6 files
(5)stat:查看文件元数据属性
stat:查看文件元数据属性
stat 命令用于查看文件的元数据属性,包括文件大小、权限、所有者、访问时间、修改时间等关键信息,是了解文件状态的重要工具。
[csh@centos7 ~]$ stat /etc/fstab
文件:"/etc/fstab"
大小:541 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:67160130 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:etc_t:s0
最近访问:2022-12-14 11:09:49.628179033 +0800
最近更改:2022-12-13 10:38:44.625179973 +0800
最近改动:2022-12-13 10:53:38.563774524 +0800
创建时间:-
(6)touch:创建空文件 & 更新文件时间戳
touch 命令的核心功能有两个:一是创建新的空文件;二是更新已有文件的访问时间、修改时间和改动时间,适用于文件创建、时间戳同步等场景。
# 1. 创建新的空文件
[csh@centos7 ~]$ touch new_file.txt
[csh@centos7 ~]$ ls new_file.txt
new_file.txt
# 2. 更新已有文件的时间戳(同步为当前系统时间)
[csh@centos7 ~]$ ls -l new_file.txt
-rw-rw-r--. 1 csh csh 0 12月 14 10:51 new_file.txt
[csh@centos7 ~]$ touch new_file.txt
[csh@centos7 ~]$ ls -l new_file.txt
-rw-rw-r--. 1 csh csh 0 12月 14 13:36 new_file.txt
# 3. -c 选项:若文件不存在,不创建任何文件(避免误创建)
[csh@centos7 ~]$ touch -c no_exist_file.txt
[csh@centos7 ~]$ ls no_exist_file.txt
ls: 无法访问no_exist_file.txt: 没有那个文件或目录
(7)mkdir:创建目录
mkdir(Make Directory)命令用于创建新目录,支持单目录创建、多目录批量创建及级联创建(创建多层嵌套目录),满足不同场景的目录创建需求。
# 1. 创建单个目录
[csh@centos7 ~]$ mkdir lab
[csh@centos7 ~]$ ls
lab 公共 模板 视频 图片 文档 下载 音乐 桌面
# 2. 批量创建多个目录
[csh@centos7 ~]$ mkdir lab1 lab2
[csh@centos7 ~]$ ls
lab lab1 lab2 公共 模板 视频 图片 文档 下载 音乐 桌面
# 3. -p 选项:级联创建多层嵌套目录(若父目录不存在,自动创建)
[csh@centos7 ~]$ mkdir -p dir1/dir2/dir3/dir4
[csh@centos7 ~]$ tree dir1
dir1
└── dir2
└── dir3
└── dir4
3 directories, 0 files
(8)cp:复制文件与目录
cp(Copy)命令用于复制文件和目录,是文件备份、迁移的核心工具,支持单文件复制、多文件批量复制、目录复制及文件重命名复制,搭配选项可实现覆盖提示、递归复制等功能。
# 1. 复制单个文件到目标位置(当前目录用“.”表示)
[csh@centos7 ~]$ cd lab
[csh@centos7 lab]$ cp /etc/hosts .
[csh@centos7 lab]$ ls
hosts
# 2. 复制文件并重新命名
[csh@centos7 lab]$ cp /etc/hosts ./hosts_backup
[csh@centos7 lab]$ ls
hosts hosts_backup
# 3. -i 选项:目标文件已存在时,提示是否覆盖(避免误覆盖)
[csh@centos7 lab]$ cp -i /etc/hosts ./hosts_backup
cp:是否覆盖"./hosts_backup"? yes
# 4. 复制多个文件到目标目录(目标必须是目录)
[csh@centos7 lab]$ cp /etc/passwd /etc/hosts.allow .
[csh@centos7 lab]$ ls
hosts hosts_backup hosts.allow passwd
# 5. -r 选项:递归复制目录(复制目录必须加该选项)
[csh@centos7 lab]$ cp -r /etc/yum .
[csh@centos7 lab]$ ls
hosts hosts_backup hosts.allow passwd yum
# 6. 复制目录并重新命名
[csh@centos7 lab]$ cp -r /etc/yum ./yum_backup
[csh@centos7 lab]$ ls
hosts hosts_backup hosts.allow passwd yum yum_backup
(9)mv:移动文件与目录 & 重命名
mv(Move)命令具有双重功能:一是移动文件和目录到指定位置;二是对文件或目录进行重命名,操作高效,且不会改变文件的属性和内容,是文件迁移、重命名的首选工具。
# 1. 移动单个文件到目标目录
[csh@centos7 lab]$ mv hosts_backup ../lab1
[csh@centos7 lab]$ ls ../lab1
hosts_backup
# 2. 批量移动多个文件到目标目录
[csh@centos7 lab]$ mv passwd hosts /home/csh/lab1/
[csh@centos7 lab]$ ls ../lab1
hosts hosts_backup passwd
# 3. 重命名文件(目标位置与原位置一致,仅修改名称)
[csh@centos7 lab]$ mv hosts.allow hosts.allow_new
[csh@centos7 lab]$ ls
hosts.allow_new yum yum_backup
# 4. 移动单个目录到目标位置
[csh@centos7 lab]$ mv yum ../lab1
[csh@centos7 lab]$ ls ../lab1
hosts hosts_backup passwd yum
# 5. 批量移动多个目录到目标位置
[csh@centos7 lab]$ mv yum_backup ../lab1
[csh@centos7 lab]$ ls ../lab1
hosts hosts_backup passwd yum yum_backup
(10)rm:删除文件与目录
rm(Remove)命令用于删除文件和目录,支持单文件删除、多文件批量删除、目录删除等功能,搭配选项可实现强制删除、递归删除,是清理文件和目录的核心工具。**注意**:rm 命令删除的文件无法恢复,操作时需谨慎,尤其是 root 用户,避免误删系统关键文件。
# 1. 删除单个文件
[csh@centos7 lab1]$ rm hosts
[csh@centos7 lab1]$ ls
hosts_backup passwd yum yum_backup
# 2. 批量删除多个文件
[csh@centos7 lab1]$ rm hosts_backup passwd
[csh@centos7 lab1]$ ls
yum yum_backup
# 3. -f 选项:强制删除文件,不提示确认(适用于批量删除)
[csh@centos7 lab1]$ rm -f test_file.txt
# 4. -r 选项:递归删除目录(删除目录必须加该选项)
[csh@centos7 lab1]$ rm -r yum
[csh@centos7 lab1]$ ls
yum_backup
# 5. -fr 选项:递归强制删除目录(不提示确认,快速清理目录)
[csh@centos7 lab1]$ rm -fr yum_backup
[csh@centos7 lab1]$ ls
# 6. 清理实验环境(批量删除多个目录)
[csh@centos7 lab1]$ cd ..
[csh@centos7 ~]$ rm -fr lab lab1 lab2 dir1
[csh@centos7 ~]$ ls
公共 模板 视频 图片 文档 下载 音乐 桌面
(11)rmdir:删除空目录
rmdir 命令仅用于删除空目录,若目录中包含文件或子目录,删除会失败,适用于清理空目录,操作更安全,可避免误删目录内的文件。
# 删除空目录
[csh@centos7 ~]$ rmdir lab2
# 目录非空时,删除失败
[csh@centos7 ~]$ rmdir lab1
rmdir: 删除 "lab1" 失败: 目录非空
(12)软连接
soft link,也成为 symbolic link(符号链接)。
[csh@centos7 ~]$ ls -dl /bin
lrwxrwxrwx. 1 root root 7 11月 2 17:32 /bin -> usr/bin
# 创建软连接
[csh@centos7 ~]$ ln -s /var/tmp/ mytmp
[csh@centos7 ~]$ ls -l mytmp
lrwxrwxrwx. 1 csh csh 9 11月 4 11:40 mytmp -> /var/tmp/
[csh@centos7 ~]$ ls mytmp
abrt
systemd-private-cc2ca9fc4c76487786a01ace1c2d3c02-bolt.service-7QksBe
systemd-private-cc2ca9fc4c76487786a01ace1c2d3c02-chronyd.service-sy8uDv
systemd-private-cc2ca9fc4c76487786a01ace1c2d3c02-colord.service-ZHr5vc
systemd-private-cc2ca9fc4c76487786a01ace1c2d3c02-cups.service-RPtndj
systemd-private-cc2ca9fc4c76487786a01ace1c2d3c02-rtkit-daemon.service-YLtiRi
[csh@centos7 ~]$ ls /var/tmp/
abrt
systemd-private-cc2ca9fc4c76487786a01ace1c2d3c02-bolt.service-7QksBe
systemd-private-cc2ca9fc4c76487786a01ace1c2d3c02-chronyd.service-sy8uDv
systemd-private-cc2ca9fc4c76487786a01ace1c2d3c02-colord.service-ZHr5vc
systemd-private-cc2ca9fc4c76487786a01ace1c2d3c02-cups.service-RPtndj
systemd-private-cc2ca9fc4c76487786a01ace1c2d3c02-rtkit-daemon.service-YLtiRi
[csh@centos7 ~]$ touch mytmp/myfile
[csh@centos7 ~]$ ls /var/tmp/myfile
/var/tmp/myfile
(13)硬连接
硬链接就是一个普通文件。相当于,可以通过多个文件名访问同一个数据块。任何一个文件发生的变化,其他文件也跟着变。
[csh@centos7 lab]$ cp /etc/hosts ./hosts-1
# 创建硬链接
[csh@centos7 lab]$ ln hosts-1 hosts-2
[csh@centos7 lab]$ ls -l hosts-1 hosts-2
-rw-r--r--. 2 csh csh 158 11月 4 13:34 hosts-1
-rw-r--r--. 2 csh csh 158 11月 4 13:34 hosts-2
# 两个文件的inode是相同的
[csh@centos7 lab]$ ls -i1 hosts-1 hosts-2
33554556 hosts-1
33554556 hosts-2
# 更新hosts-1时间,hosts-2也跟着一起变动
[csh@centos7 lab]$ touch hosts-1
[csh@centos7 lab]$ ls -l hosts-1 hosts-2
-rw-r--r--. 2 csh csh 158 11月 4 13:36 hosts-1
-rw-r--r--. 2 csh csh 158 11月 4 13:36 hosts-2
# 更新hosts-1文件内容,hosts-2也跟着一起变动
[csh@centos7 lab]$ cat hosts-1
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[csh@centos7 lab]$ cat hosts-2
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[csh@centos7 lab]$ echo hello world >> hosts-1
[csh@centos7 lab]$ cat hosts-1
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
hello world
[csh@centos7 lab]$ cat hosts-2
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
hello world
shell 扩展匹配文件
| 模式 | 匹配项 |
|---|---|
* |
由零个或更多字符组成的任何字符串。单独*不匹配隐藏文件。 |
? |
任何一个字符。 |
[abc…] |
位于两个方括号之间中的任何一个字符。 |
[^abc…]或[!abc…] |
不在括起的类中的任何一个字符。 |
~ |
当前用户的主目录。 |
~username |
username用户的主目录。 |
[[:alpha:]] |
任何字母字符,相当于[a-Z]。 |
[[:lower:]] |
任何小写字符。 |
[[:upper:]] |
任何大写字符。 |
[[:alnum:]] |
任何字母字符或数字,相当于[a-Z0-9]。 |
[[:punct:]] |
除空格和字母数字以外的任何可打印字符。 |
[[:digit:]]或[0-9] |
从 0 到 9 的任何单个数字。 |
[[:space:]] |
任何一个空白字符。这可能包括制表符、 换行符、回车符、 换页符或空格。 |
示例 *
匹配由零个或更多字符组成的任何字符串。单独*不匹配隐藏文件。
# 准备文件
[csh@centos7 lab]$ touch file-1 file-2 file-a file-a1 file-a2 file-ab file-b
[csh@centos7 lab]$ ls file-*
file-1 file-2 file-a file-a1 file-a2 file-ab file-b
# 查看文件名称是 file- 后跟1个字母的文件
[csh@centos7 lab]$ ls file-?
file-1 file-2 file-a file-b
# 查看文件名称是 file- 后跟2个字母的文件
[csh@centos7 lab]$ ls file-??
file-a1 file-a2 file-ab
# 查看文件名称是 file- 后跟3个字母的文件
[csh@centos7 lab]$ ls file-???
ls: 无法访问file-???: 没有那个文件或目录
示例 ?
匹配任何一个字符。
# 准备文件
[csh@centos7 lab]$ touch file-1 file-2 file-a file-a1 file-a2 file-ab file-b
[csh@centos7 lab]$ ls file-*
file-1 file-2 file-a file-a1 file-a2 file-ab file-b
# 查看文件名称是 file- 后跟1个字母的文件
[csh@centos7 lab]$ ls file-?
file-1 file-2 file-a file-b
# 查看文件名称是 file- 后跟2个字母的文件
[csh@centos7 lab]$ ls file-??
file-a1 file-a2 file-ab
# 查看文件名称是 file- 后跟3个字母的文件
[csh@centos7 lab]$ ls file-???
ls: 无法访问file-???: 没有那个文件或目录
示例 [ ]
匹配位于两个方括号之间中的任何一个字符。
[csh@centos7 lab]$ ls file-?
file-1 file-2 file-a file-b
[csh@centos7 lab]$ ls file-[abc]
file-a file-b
[csh@centos7 lab]$ ls file-[12]
file-1 file-2
[csh@centos7 lab]$ ls file-[^12]
file-a file-b
集合示例
# 准备文件
[csh@centos7 lab]$ touch file-9 file-A file-Z file-z
# 匹配所有数字
[csh@centos7 lab]$ ls file-[0-9]
file-1 file-2 file-9
[csh@centos7 lab]$ ls file-[[:digit:]]
file-1 file-2 file-9
# 匹配所有大写字母
[csh@centos7 lab]$ ls file-[[:upper:]]
file-A file-Z
# 匹配所有小写字母
[csh@centos7 lab]$ ls file-[[:lower:]]
file-a file-b file-z
# 匹配所有字母
[csh@centos7 lab]$ ls file-[a-Z]
file-a file-A file-b file-z file-Z
[csh@centos7 lab]$ ls file-[[:alpha:]]
file-a file-A file-b file-z file-Z
# 匹配所有字母和数字
[csh@centos7 lab]$ ls file-[[:alnum:]]
file-1 file-2 file-9 file-a file-A file-b file-z file-Z
示例 ~
匹配用户家目录。
[csh@centos7 lab]$ echo ~
/home/csh
[csh@centos7 lab]$ cd ~
[csh@centos7 ~]$ pwd
/home/csh
[csh@centos7 ~]$ echo ~root
/root
[csh@centos7 ~]$ cd ~root
-bash: cd: /root: 权限不够
示例 { }
[csh@centos7 lab]$ ls file-[abc]
file-a file-b
[csh@centos7 lab]$ ls file-{a,b,c}
# 相当于下面命令
[csh@centos7 lab]$ ls file-a file-b file-c
ls: 无法访问file-c: 没有那个文件或目录
file-a file-b
# {1..5}表达一个范围
[csh@centos7 lab]$ ls file-{1..5}
ls: 无法访问file-3: 没有那个文件或目录
ls: 无法访问file-4: 没有那个文件或目录
ls: 无法访问file-5: 没有那个文件或目录
file-1 file-2
三、总结
Linux 以 FHS 锚定文件系统秩序,用标准化目录消解自由带来的混乱,让万千发行版拥有共通的底层语言。命令行并非晦涩的指令堆砌,而是系统与运维者对话的极简法门,路径跳转、文件增删、软硬链接、通配匹配,每一条命令都是穿透层级、调度资源的钥匙。
跳出图形化操作的表层依赖,吃透目录层级逻辑与文件管理本质,方能挣脱可视化工具的束缚,直抵操作系统内核脉络。运维的根基始于文件管理,于方寸目录间理清系统脉络,以规范约束随性,以指令掌控全局,方能在服务器运维、嵌入式开发的场景里举重若轻,从容驾驭庞大而精密的 Linux 生态。
更多推荐

所有评论(0)