探索 Linux 文件系统

内容纲要

查看【Linux】专题可浏览更多内容

文件系统控制数据的存储和检索方式,是一个分区或磁盘上的文件的逻辑集合。

探索

pwd —— 我在哪?

一般来说在首次登陆系统或启动终端仿真器时工作目录位于 ~,那么如何知道这个 ~ 的具体路径?使用 pwd 命令。

pwd 命令的全称为「print working directory」,用于显示当前目录的绝对路径。

tom@debian:~$ pwd
/home/tom

在创建用户时一般会创建一个以用户名为名的用户主目录。如上,用户 tom 的主目录为 /home/tom

💡 一般来说主目录是普通用户唯一有写入权限的地方。

💡 不同于非特权用户,Root 用户有着自己不一样的主目录:/root

你可以在任何工作目录使用 pwd 命令了解你当前所在目录的绝对路径。

ls——都有啥?

ls 命令列出目标目录下的文件。

你可以使用 ls 命令来列出当前工作目录下都有什么东西:

ls /home
tom

cd——去到哪

cd 命令的全称为「change directory」,也就是改变当前的工作目录。

刚才只是查看了 /home 目录下都有什么,现在要切换工作目录到 /home 目录:

cd /home

cd 命令的一些实用技巧:

# 回到来时的目录:
cd -

# 去到当前用户的主目录:
cd ~

# 去到目标用户的主目录,如用户 jerry 的主目录:
cd ~jerry

# 主目录下有一个名为 Downloads 的文件夹
cd ~/Downloads/ # 等同于 cd /home/<用户名>/Downloads

绝对路径与相对路径

在前面使用 pwd 命令了解到,绝对路径就是从根目录开始直到目标目录或文件的完整路径。

而相对路径则是从工作目录开始的路径,主要运用表示当前目录的 . 及表示当前目录的父级目录的 ..,假设当前工作目录为 /home,那么可以这么运用:

# 当想去到 /home 目录下的 tom 目录时:
cd ./tom
# 当然一般简写成:
cd tom

# 当想去到当前目录的父级时:
cd ..

文件树系统

类 Unix 系统与 Windows 系统一样按照有层次的目录结构来组织文件的。也就是说文件是类似于树状的目录结构组织的,其中包含了文件和子目录,而子目录中还可以包含更多的文件和子目录,依此类推。

💡 在一些系统中「目录」也被称为「文件夹」。

文件系统中的第一个目录 / 被称为「根目录」。

根目录下有哪些东西?

tree -Ld 1 /
/
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib32 -> usr/lib32
├── lib64 -> usr/lib64
├── libx32 -> usr/libx32
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

根据 Filesystem Hierarchy Standard 标准,这些重要的标准目录及内容含义如下:

路径名 内容
/bin 核心操作系统命令
/boot 引导装载程序、内核以及内核所需要的文件
/compat FreeBSD 中用于实现 Linux 二进制兼容的文件及库
/dev 磁盘、打印机、伪终端等设备项
/etc 关键的启动文件和配置文件
/home 用户默认的主目录
/lib 库、共享库及 /bin、/sbin 要用到的一些命令
/media 用于可移除设备文件系统的挂载点
/mnt 可移动设备的临时挂载点
/opt 可选的软件包
/proc 有关所有正在运行的进程的信息
/root 超级用户的主目录
/run 运行程序的汇集处(PID、Socket 等)
/sbin 核心操作系统命令
/srv Web 或其他服务器需要用到的文件
/sys 另一种不同的内核接口
/tmp 临时文件,系统重启后可能会消失
/usr 另一个层次结构,包含了次要的文件及命令
/usr/bin 大部分命令及可执行文件
/usr/include 编译 C 程序时需要用到的头文件
/usr/lib 库以及标准程序的支持文件
/usr/local 本地软件或配置数据,是 /usr 的镜像结构
/usr/sbin 不太必须的系统管理与修复命令
/usr/share 可在多个系统之间共享的内容
/usr/share/man 在线手册页
/usr/src 非本地软件的源代码(未广泛使用)
/usr/tmp 更多的临时空间(在重新启动之后会保留)
/var 系统特定的数据以及少数配置文件
/var/adm 包含各种内容:日志、设置记录、奇怪的管理信息
/var/log 系统日志文件
/var/run 和 /run 功能一样,现通常作为一个符号链接
/var/spool 供打印机、邮件等使用的假脱机(存储)目录
/var/tmp 更多的临时空间(在重新启动之后会保留)

💡 Windows 上的存储设备,如硬盘、外接移动硬盘或 U 盘就是以新的盘符的形式出现,有着各自独立的文件系统树,在类 Unix 系统中不管增加了多少存储设备,都只有一个文件树系统,而这些存储设备会「挂载」到文件树的特定位置。

隐藏文件

在类 Unix 系统中在文件名的开头加上 . 就表示隐藏文件(如 .123.txt),单纯使用 ls 命令并不会显示它们,你可以加上 -a 选项:

ls -a

文件后缀名?

在 Linux 系统中没有「文件后缀名」的概念,所以不能以文件名来判定文件的用户或后缀,如不能以文件名为 .jpg 后缀就判定这是一个图片文件。

判断文件类型

那么怎么判断一个文件是什么类型?可以使用 file 命令:

file image.zip
image.zip: PNG image data, 1842 x 1370, 8-bit/color RGBA, non-interlaced

如上将一个图片文件以 .zip 为文件后缀名,依然是可以正确判断出文件类型的。

那么再来看一个命令:

file /home
/home: directory

你可能会惊讶于这也能用 file 命令判断?目录也算文件吗?

「万物皆文件」

在类 Unix 系统中有一个「万物皆文件(everything is a file)」的思想。

可以使用 ls 命令加上选项 -l 得知指定目录下的文件都是什么文件类型,如:

# -l 表示以列表的形式列出
ls -l /boot
-rw-r--r-- 1 root root   236106 Mar  8 05:06 config-5.10.0-12-amd64
-rw-r--r-- 1 root root   236055 Oct  1 03:36 config-5.10.0-9-amd64
drwxr-xr-x 5 root root     4096 Mar 14 20:20 grub
-rw-r--r-- 1 root root 28262606 Mar 14 20:20 initrd.img-5.10.0-12-amd64
-rw-r--r-- 1 root root 28248487 Nov 22 18:44 initrd.img-5.10.0-9-amd64
-rw-r--r-- 1 root root       83 Mar  8 05:06 System.map-5.10.0-12-amd64
-rw-r--r-- 1 root root       83 Oct  1 03:36 System.map-5.10.0-9-amd64
-rw-r--r-- 1 root root  6837280 Mar  8 05:06 vmlinuz-5.10.0-12-amd64
-rw-r--r-- 1 root root  6833568 Oct  1 03:36 vmlinuz-5.10.0-9-amd64

上列每行开头就表示了这是一个什么类型的文件,如 d 表示目录,- 表示普通文件。

大多数文件系统实现定义了 7 种文件类型:

文件类型 符号
普通文件 -
目录 d
字符设备文件 c
块设备文件 b
本地域套接字 s
具名管道(FIFO) p
符号链接 l

延伸

附一些使用的 ls 命令选项:

  • -l:以列表方式显示内容;
  • -h:显示人类可读的文件大小格式;
  • -a:显示隐藏文件;
  • -S:以文件大小排序;
  • -X:按文件扩展名排序
  • --hide=*.conf 隐藏特定扩展名文件结构
  • -R:递归列出文件
ls -lhS /

💡 之前的文章提到 ls 命令本质上是一个带有参数的别名,如果想要使用原始的 ls 命令可以使用:\ls