探索 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