当登录系统并获得shell命令提示符后,你通常位于自己的主目录中。一般情况下,你会想去
逛逛主目录之外的其他地方。本节将告诉你如何使用shell命令来实现这个目标。在开始前,先了
解一下Linux文件系统,为下一步作铺垫。

3.4.1 Linux 文件系统

如果你刚接触Linux系统,可能就很难弄清楚Linux如何引用文件和目录,对已经习惯
Microsoft Windows操作系统方式的人来说更是如此。在继续探索Linux系统之前,先了解一下它
的布局是有好处的。
你将注意到的第一个不同点是,Linux在路径名中不使用驱动器盘符。在Windows中,PC上
安装的物理驱动器决定了文件的路径名。Windows会为每个物理磁盘驱动器分配一个盘符,每个
驱动器都会有自己的目录结构,以便访问存储其中的文件。

举个例子,在Windows中经常看到这样的文件路径:

  1. c:\Users\Rich\Documents\test.doc

这种Windows文件路径表明了文件test.doc究竟位于哪个磁盘分区中。如果你将test.doc保存在
闪存上,该闪存由J来标识,那么文件的路径就是J:\test.doc。该路径表明文件位于J盘的根目录下。

Linux则采用了一种不同的方式。Linux将文件存储在单个目录结构中,这个目录被称为虚拟
目录(virtual directory)。虚拟目录将安装在PC上的所有存储设备的文件路径纳入单个目录结构中。

Linux虚拟目录结构只包含一个称为根(root)目录的基础目录。根目录下的目录和文件会按
照访问它们的目录路径一一列出,这点跟Windows类似。


窍门 你将会发现Linux使用正斜线(/)而不是反斜线(\)在文件路径中划分目录。在Linux中,
反斜线用来标识转义字符,要是用在文件路径中的话会导致各种各样的问题。如果你之
前用的是Windows环境,就需要一点时间来适应。


在Linux中,你会看到下面这种路径:

  1. /home/Rich/Documents/test.doc

这表明文件test.doc位于Documents目录,Documents又位于rich目录中,rich则在home目录中。
要注意的是,路径本身并没有提供任何有关文件究竟存放在哪个物理磁盘上的信息。

Linux虚拟目录中比较复杂的部分是它如何协调管理各个存储设备。在Linux PC上安装的第
一块硬盘称为根驱动器。根驱动器包含了虚拟目录的核心,其他目录都是从那里开始构建的。

Linux会在根驱动器上创建一些特别的目录,我们称之为挂载点(mount point)。挂载点是虚
拟目录中用于分配额外存储设备的目录。虚拟目录会让文件和目录出现在这些挂载点目录中,然
而实际上它们却存储在另外一个驱动器中。

通常系统文件会存储在根驱动器中,而用户文件则存储在另一驱动器中,如图3-2所示。
image.png

图3-2展示了计算机中的两块硬盘。一块硬盘和虚拟目录的根目录(由正斜线/表示)关联起
来。剩下的硬盘就可以挂载到虚拟目录结构中的任何地方。在这个例子中,第二块硬盘被挂载到
了/home位置,用户目录都位于这个位置。
Linux文件系统结构是从Unix文件结构演进过来的。在Linux文件系统中,通用的目录名用于
表示一些常见的功能。表3-3列出了一些较常见的Linux顶层虚拟目录名及其内容。
image.png
常见的目录名均基于文件系统层级标准(filesystem hierarchy standard,FHS)。很多Linux发
行版都遵循了FHS。这样一来,你就能够在任何兼容FHS的Linux系统中轻而易举地查找文件。


说明 FHS偶尔会进行更新。你可能会发现有些Linux发行版仍在使用旧的FHS标准,而另外一
些则只实现了部分当前标准。要想保持与FHS标准同步,请访问其官方主页:http://www.pathname.com/fhs


在登录系统并获得一个shell CLI提示符后,会话将从主目录开始。主目录是分配给用户账户
的一个特有目录。用户账户在创建之后,系统通常会为其分配一个特有的目录(参见第7章)。
可以使用图形界面在虚拟目录中跳转。要想在CLI提示符下切换虚拟目录,需要使用cd命令。

3.4.2 遍历目录

在Linux文件系统上,可以使用切换目录命令cd将shell会话切换到另一个目录。cd命令的格
式非常简单:

  1. cd destination

cd命令可接受单个参数destination,用以指定想切换到的目录名。如果没有为cd命令指
定目标路径,它将切换到用户主目录。
destination参数可以用两种方式表示:一种是使用绝对文件路径,另一种是使用相对文件
路径。
接下来将分别阐述这两种方法。这两者之间的不同对于理解文件系统遍历非常重要。

1. 绝对文件路径

用户可在虚拟目录中采用绝对文件路径引用目录名。绝对文件路径定义了在虚拟目录结构中
该目录的确切位置,以虚拟目录的根目录开始,相当于目录的全名。

绝对文件路径总是以正斜线(/)作为起始,指明虚拟文件系统的根目录。因此,如果要指
向usr目录所包含的bin目录下的用户二进制文件,可以使用如下绝对文件路径:

  1. /usr/bin

使用绝对文件路径可以清晰表明用户想切换到的确切位置。要用绝对文件路径来切换到文件
系统中的某个特定位置,只需在cd命令后指定全路径名:

  1. christine@server01:~$ cd /usr/bin
  2. christine@server01:/usr/bin$

注意,在上面的例子中,提示符中一开始有一个波浪号(~)。在切换到另一个目录之后,这
个波浪号被/usr/bin替代了。CLI提示符正是用它来帮助你跟踪当前所在虚拟目录结构中的位置。
波浪号表明shell会话位于你的主目录中。在切换出主目录之后,如果提示符已经进行了相关配置
的话,绝对文件路径就会显示在提示符中。


说明 如果你的shell CLI提示符中并没有显示shell会话的当前位置,那是因为它并没有进行相关
的配置。如果你希望修改CLI提示符的话,第6章会告诉你如何更改配置。


如果没有配置好提示符来显示当前shell会话的绝对文件路径,也可以使用shell命令来显示所
处的位置。pwd命令可以显示出shell会话的当前目录,这个目录被称为当前工作目录。pwd命令
的用法如下:

  1. christine@server01:/usr/bin$ pwd
  2. /usr/bin
  3. christine@server01:/usr/bin$

窍门 在切换到新的当前工作目录时使用pwd命令,是很好的习惯。因为很多shell命令都是在当
前工作目录中操作的,在发出命令之前,你应该始终确保自己处在正确的目录之中。


可以使用绝对文件路径切换到Linux虚拟目录结构中的任何一级:

  1. christine@server01:/usr/bin$ cd /var/log
  2. christine@server01:/var/log$
  3. christine@server01:/var/log$ pwd
  4. /var/log
  5. christine@server01:/var/log$

还可以从Linux虚拟目录中的任何一级跳回主目录:

  1. christine@server01:/var/log$ cd
  2. christine@server01:~$
  3. christine@server01:~$ pwd
  4. /home/christine
  5. christine@server01:~$

但是,如果你只是在自己的主目录中工作,经常使用绝对文件路径的话未免太过冗长。例如,
若已经位于目录/home/christine,再输入下面这样的命令切换到Documents目录就有些繁琐了:

  1. cd /home/christine/Documents

幸好还有一种简单的解决方法。

2. 相对文件路径

相对文件路径允许用户指定一个基于当前位置的目标文件路径。相对文件路径不以代表根目
录的正斜线(/)开头,而是以目录名(如果用户准备切换到当前工作目录下的一个目录)或是
一个特殊字符开始。假如你位于home目录中,并希望切换到Documents子目录,那你可以使用cd
命令加上一个相对文件路径:

  1. christine@server01:~$ pwd
  2. /home/christine
  3. christine@server01:~$
  4. christine@server01:~$ cd Documents
  5. christine@server01:~/Documents$ pwd
  6. /home/christine/Documents
  7. christine@server01:~/Documents$

上面的例子并没有使用正斜线(/),而是采用了相对文件路径将当前工作目录从
/home/christine改为/home/christine/Documents,大大减少了输入内容。

另外,此例中还要注意的是,如果提示符经过配置可以显示出当前工作目录,它就会一直显
示波浪号。这表明当前工作目录位于用户home目录之下。


窍门 如果你刚接触命令行和Linux目录结构,建议暂时先坚持使用绝对文件路径。等熟悉了目
录布局之后,再使用相对文件路径。


可以在任何包含子目录的目录中使用带有相对文件路径的cd命令。也可以使用一个特殊字符
来表示相对目录位置。
有两个特殊字符可用于相对文件路径中:
单点符(.),表示当前目录;
双点符(..),表示当前目录的父目录。
你可以使用单点符,不过对cd命令来说,这没有什么意义。在本章后面你会看到另一个命令
如何有效地在相对文件路径中使用单点符。
双点符在目录层级中移动时非常便利。如果你处在在主目录下的Documents目录中,需要切
换到主目录下的Downloads目录,可以这么做:

  1. christine@server01:~/Documents$ pwd
  2. /home/christine/Documents
  3. christine@server01:~/Documents$ cd ../Downloads
  4. christine@server01:~/Downloads$ pwd
  5. /home/christine/Downloads
  6. christine@server01:~/Downloads$

双点符先将用户带到上一级目录,也就是用户的主目录,然后/Downloads这部分再将用户带
到下一级目录,即Downloads目录。必要时用户也可用多个双点符来向上切换目录。假如现在位
于主目录中(/home/christine),想切换到/etc目录,可以输入如下命令:

  1. christine@server01:~$ cd ../../etc
  2. christine@server01:/etc$ pwd
  3. /etc
  4. christine@server01:/etc$

当然,在上面这种情况下,采用相对路径其实比采用绝对路径输入的字符更多,用绝对路径
的话,用户只需输入/etc。因此,只在必要的时候才使用相对文件路径。


说明 在shell CLI提示符中加入足够的信息非常方便,本节正是这么做的。不过出于清晰性的考
虑,在书中余下的例子里,我们只使用一个简单的$提示符。


既然你已经知道如何遍历文件系统和验证当前工作目录,那就可以开始探索各种目录中究竟
都有些什么东西了。下一节将学习如何查看目录中的文件。