我们上一部分已经学会了如何在文件系统中穿梭自如,现在是时候来一场深度游,探索一下我们的Linux系统了。
不过,在开始之前,我们先认识几个旅途中会用到的实用命令:ls、file 和 less。它们会是我们的眼睛和放大镜,帮助我们看清Linux世界的每一个细节。

ls 可能是我们最常用的命令了,这当然是有原因的。通过它,我们能一目了然地看到目录里都有些什么,还能了解文件和目录的一些重要属性。就像我们之前学到的,直接输入 ls 就能看到当前目录下的文件和子目录。
|$ ls Desktop Documents Music Pictures Public Templates Videos
我们不只能查看当前目录,还可以指定想看的任何地方。比如,想看看 /usr 目录里有什么:
|$ ls /usr bin games kerberos libexec sbin src etc include lib local share tmp
甚至可以一次看好几个目录。这个例子里,我们同时列出了用户的家目录(用 ~ 这个符号代表)和 /usr 目录的内容:
|$ ls ~ /usr /home/me: Desktop Documents Music Pictures Public Templates Videos /usr: bin games kerberos libexec sbin src etc include lib local share tmp
我们还可以改变输出的格式,让它显示更多细节。加上 -l 选项,我们就能看到一个长长的、详细的列表。
|$ ls -l total 56 drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Desktop drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Documents drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Music drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Pictures drwxrwxr-x 2 me me
命令就像一个动词,而我们经常在后面跟上一些“选项”(options)和“参数”(arguments)。选项通常以 - 开头,用来调整命令的行为,比如 -l 就是告诉 ls “给我看详细点”。
参数则是命令要操作的对象,比如 /usr 就是告诉 ls “去看这个目录”。
所以,一个完整的命令通常看起来像是:命令 -选项 参数。
大多数命令的选项都是单个字母,比如 -l。但很多现代命令也支持用一个完整的单词做选项,前面加两个破折号,比如 --reverse。我们还可以把好几个单字母选项串在一起用。
在探索系统的过程中,知道文件里到底是什么内容会很有用。这时 file 命令就派上用场了。
在Linux世界里,文件名后缀(比如 .jpg 或 .txt)并不像在Windows里那样重要,它更多是给人看的提示,而不是给系统看的规定。
一个叫 picture.jpg 的文件里可能根本不是图片。
所以,当我们想确定一个文件的真实类型时,可以这样问问 file:
|$ file picture.jpg picture.jpg: JPEG image data, JFIF standard 1.01 $ file document.txt document.txt: ASCII text $ file program.sh program.sh: Bourne-Again shell script, ASCII text executable
file 命令会查看文件内部的“签名”,然后告诉我们它的真实身份。这就像是鉴宝,不看外表,只看内在。
在Linux中,“一切皆文件”是个很核心的思想,我们会慢慢体会到这句话的深意。
less 命令是一个用来查看文本文件的程序。我们的Linux系统里有大量的文件都是纯文本格式的,里面记录了系统的各种设置和信息。less 提供了一个非常方便的方式来阅读它们。
什么是“文本”呢?简单说,文本就是字符和数字的一对一映射,比如我们键盘上敲的这些字。它不包含复杂的格式信息,不像Word文档那样可以设置字体、颜色。 纯文本文件只包含字符本身,非常纯粹。系统的很多配置文件、程序脚本都是用这种纯文本格式保存的,能读懂它们,就等于能读懂系统的运作方式。
less 的用法很简单:
|$ less /etc/passwd
进入 less 之后,我们可以用以下方式操作:
less 的名字也很有趣,它是一个早期Unix程序 more 的升级版。more 只能向前翻页,而 less 则如其名,“less is more”,功能更强大,可以前后自由翻页,还能搜索,体验好得多。
现在,我们带着这几件法宝,开始在文件系统中漫游,看看是什么让我们的Linux系统运转起来的。你会发现,很多有趣的文件都是我们可以直接阅读的纯文本。在游览的过程中,可以随时尝试以下的步骤:
用 cd 进入一个你感兴趣的目录
用 ls -l 看看里面有什么
如果看到一个有趣的文件,用 file 看看它是什么类型
如果 file 告诉你它是文本,就用 less 打开它读一读
别害怕,作为普通用户,我们很难把系统搞坏。如果哪个命令提示“权限不够”,那就换个地方看看。大胆地去探索吧,在Linux的世界里,没有那么多秘密。
/ (根目录)整个文件系统的起点,所有的一切都从这里开始。就像一棵大树的树根。
|$ ls / bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
/bin (基本命令)这里存放着系统启动和运行所必需的核心二进制程序(也就是命令)。就像一个工具箱,里面装着锤子、螺丝刀这些基本工具。
|$ ls /bin | head -10 bash cat chmod cp date dd df dir dmesg echo
/etc (系统配置)存放着所有系统级别的配置文件。可以把它想象成是系统的“控制面板”,几乎所有的系统设置都在这里。这里的文件都是文本,值得花时间看看。
|$ ls /etc | head -10 adduser.conf alternatives apm apt bash.bashrc bash_completion.d bindresvport.blacklist ca-certificates ca-certificates.conf calendar
/home (用户目录)每个用户的“家”。在通常的设置下,每个用户都会在这里有一个自己的目录,用来存放私人文件。就像一栋公寓楼,每个用户都有自己的房间。
|$ ls /home user1 user2 me
/dev (设备文件)一个非常特殊的目录,存放着设备节点。在Linux里,设备(比如硬盘、鼠标)也被看作是文件,这里就是内核管理的设备清单。
|$ ls /dev | head -10 agpgart autofs block bsg btrfs-control bus cdrom char console core
/tmp (临时文件)用来存放临时文件的地方。很多程序运行时会产生一些临时数据,就放在这里。有些系统在重启时会自动清空这个目录。
/usr (用户程序)这可能是Linux系统里最大的一个目录树了。它包含了所有普通用户使用的程序和支持文件。如果说 /bin 是核心工具箱,那 /usr/bin 就是一个巨大的软件仓库。
|$ ls /usr bin games include lib lib32 lib64 libexec local sbin share src tmp
/var (可变数据)这个目录存放的是经常变化的数据,比如各种日志文件(/var/log)。如果系统出了什么问题,来这里翻看日志通常能找到线索。
|$ ls /var backups cache crash lib local lock log mail opt run snap spool tmp
在探索时,你可能会看到这样一种特殊的文件:
|$ ls -l /usr/bin/python lrwxrwxrwx 1 root root 11 2007-08-11 07:34 python -> python3.9
注意看,这一行的第一个字母是 l,而且文件名后面还跟着一个箭头指向另一个文件名。这就是“符号链接”(symbolic link),也叫“软链接”(soft link)。它就像是Windows桌面上的快捷方式。
想象一个场景:一个程序需要用到一个叫 foo 的共享文件,但这个 foo 文件经常更新换代,文件名里最好能带上版本号,比如 foo-2.6。
问题来了,如果把文件名写死成 foo-2.6,那下次升级到 foo-2.7,岂不是要去修改所有用到它的程序的代码?这太麻烦了。
符号链接完美地解决了这个问题。我们可以创建一个叫 foo 的符号链接,让它指向 foo-2.6。程序只需要认准 foo 这个名字就行,实际上用的是 foo-2.6。
当升级到 foo-2.7 时,我们只需要删除旧的链接,创建一个新的 foo 链接,让它指向新版本 foo-2.7。整个过程对程序来说是透明的,可以做到无缝切换。
|# 创建符号链接 $ ln -s target_file link_name # 查看符号链接指向哪里 $ ls -l link_name # 删除符号链接 $ rm link_name
除了符号链接,还有一种叫做“硬链接”(hard link)的东西,它也能让文件有多个名字,但实现方式有所不同。我们将在该课程的后续更深入地探讨它们之间的区别。
|# 1. 探索你的主目录 $ cd ~ $ ls -la # 2. 查看系统配置 $ ls /etc | grep -i “passwd\|hosts\|network” # 3. 检查文件类型 $ file /etc/passwd $ file /bin/ls # 4. 阅读系统文件 $ less /etc/passwd $ less /etc/hosts # 5. 寻找符号链接 $ ls -l