探究操作系统

    • ls — 列出目录内容

    • file — 确定文件类型

    • less — 浏览文件内容

    ls 可能是用户最常使用的命令了,这自有它的道理。通过它,我们可以知道目录的内容,以及各种各样重要文件和目录的属性。正如我们已经见到的,只要简单地输入 ls 就能看到在当前目录下所有文件和子目录的列表。

    除了当前工作目录以外,也可以指定别的目录,就像这样:

    1. bin games kerberos libexec sbin src
    2. etc include lib local share tmp

    甚至可以列出多个指定目录的内容。在这个例子中,将会列出用户家目录(用字符“~”代表)和/usr 目录的内容:

    1. /home/me:
    2. Desktop Documents Music Pictures Public Templates Videos
    3. /usr:
    4. bin games kerberos libexec sbin src
    5. etc include lib local share tmp

    我们也可以改变输出格式,来得到更多的细节:

    1. [me@linuxbox ~]$ ls -l
    2. drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Desktop
    3. drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Documents
    4. drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Music
    5. drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Pictures
    6. drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Public
    7. drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Templates
    8. drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Videos

    使用 ls 命令的“-l”选项,则结果以长模式输出。

    4.1.1 选项和参数

    我们将学习一个非常重要的知识点,即大多数命令是如何工作的。命令名经常会带有一个或多个用来更正命令行为的选项,更进一步,选项后面会带有一个或多个参数,这些参数是命令作用的对象。所以大多数命令看起来像这样:

    大多数命令使用的选项,是由一个中划线加上一个字符组成,例如,“-l”,但是许多命令,包括来自于 GNU 项目的命令,也支持长选项,长选项由两个中划线加上一个字组成。当然,许多命令也允许把多个短选项串在一起使用。下面这个例子,ls 命令有两个选项,“l” 选项产生长格式输出,“t”选项按文件修改时间的先后来排序。

    1. [me@linuxbox ~]$ ls -lt

    加上长选项 “—reverse”,则结果会以相反的顺序输出:

    1. [me@linuxbox ~]$ ls -lt --reverse

    ls 命令有大量的选项。下表列出了ls命令最常用的选项。


    4.1.2 深入研究长格式输出

    正如我们先前知道的,“-l”选项导致 ls 的输出结果以长格式输出。这种格式包含大量的有用信息。下面的例子目录来自于 Ubuntu 系统:

    1. -rw-r--r-- 1 root root 47584 2007-04-03 11:05 logo-Edubuntu.png
    2. -rw-r--r-- 1 root root 44355 2007-04-03 11:05 logo-Kubuntu.png
    3. -rw-r--r-- 1 root root 34391 2007-04-03 11:05 logo-Ubuntu.png
    4. -rw-r--r-- 1 root root 32059 2007-04-03 11:05 oo-cd-cover.odf
    5. -rw-r--r-- 1 root root 159744 2007-04-03 11:05 oo-derivatives.doc
    6. -rw-r--r-- 1 root root 27837 2007-04-03 11:05 oo-maxwell.odt
    7. -rw-r--r-- 1 root root 98816 2007-04-03 11:05 oo-trig.xls
    8. -rw-r--r-- 1 root root 453764 2007-04-03 11:05 oo-welcome.odt

    选一个文件,来看一下各个输出字段的含义:

    4.2 确定文件类型

    随着探究操作系统的进行,知道文件包含的内容是很有用的。我们将用 file 命令来确定文件的类型。我们之前讨论过,在 Linux 系统中,并不要求文件名来反映文件的内容。然而,一个类似 “picture.jpg” 的文件名,我们会期望它包含 JPEG 压缩图像,但 Linux 却不这样要求它。可以这样调用 file 命令:

    当调用 file 命令后,file 命令会打印出文件内容的简单描述。例如:

    1. [me@linuxbox ~]$ file picture.jpg
    2. picture.jpg: JPEG image data, JFIF standard 1.01

    有许多种类型的文件。事实上,在类 Unix 操作系统中比如说 Linux 中,有个普遍的观念就是“一切皆文件”。随着课程的进行,我们将会明白这句话是多么的正确。

    虽然系统中许多文件格式是熟悉的,例如 MP3和 JPEG 文件,但也有一些文件格式比较含蓄,极少数文件相当陌生。

    less 命令是一个用来浏览文本文件的程序。纵观 Linux 系统,有许多人类可读的文本文件。less 程序为我们检查文本文件提供了方便。


    为什么我们要查看文本文件呢? 因为许多包含系统设置的文件(叫做配置文件),是以文本格式存储的,阅读它们可以更深入的了解系统是如何工作的。另外,许多系统所用到的实际程序(叫做脚本)也是以这种格式存储的。在随后的章节里,我们将要学习怎样编辑文本文件以修改系统设置,还要学习编写自己的脚本文件,但现在我们只是看看它们的内容而已。

    less 命令是这样使用的:

    一旦运行起来,less 程序允许你前后滚动文件。例如,要查看一个定义了系统中全部用户身份的文件,输入以下命令:

    1. [me@linuxbox ~]$ less /etc/passwd

    一旦 less 程序运行起来,我们就能浏览文件内容了。如果文件内容多于一页,那么我们可以上下滚动文件。按下“q”键,退出 less 程序。

    下表列出了 less 程序最常使用的键盘命令。


    4.4 快速浏览

    Linux 系统中,文件系统布局与类 Unix 系统的文件布局很相似。实际上,一个已经发布的标准,叫做 Linux 文件系统层次标准,详细说明了这种设计模式。不是所有Linux发行版都根据这个标准,但大多数都是。

    下一步,我们将在文件系统中漫游,来了解 Linux 系统的工作原理。这会给你一个温习跳转命令的机会。我们会发现很多有趣的文件都是纯人类可读文本。下面旅行开始,做做以下练习:

    1. cd 到给定目录
    2. 列出目录内容 ls -l
    3. 如果看到一个有趣的文件,用 file 命令确定文件内容
    4. 如果文件看起来像文本,试着用 less 命令浏览它

    记得复制和粘贴技巧!如果你正在使用鼠标,双击文件名,来复制它,然后按下鼠标中键,粘贴文件名到命令行中。

    在系统中漫游时,不要害怕四处看看。普通用户是很难把东西弄乱的。那是系统管理员的工作!如果一个命令抱怨一些事情,不要管它,尝试一下别的东西。花一些时间四处看看。系统是我们自己的,尽情地探究吧。记住在 Linux 中,没有秘密存在!

    下表仅仅列出了一些我们可以浏览的目录。随意尝试更多!


    在我们到处查看时,我们可能会看到一个目录,列出像这样的一条信息:

    注意看,为何这条信息第一个字符是“l”,并且有两个文件名呢?这是一个特殊文件,叫做符号链接(也称为软链接或者 symlink )。 在大多数“类 Unix” 系统中,有可能一个文件被多个文件名所指向。虽然这种特性的意义并不明显,但它真地很有用。

    描绘一下这样的情景:一个程序要求使用某个包含在名为“foo”文件中的共享资源,但是“foo”经常改变版本号。这样,在文件名中包含版本号,会是一个好主意,因此管理员或者其它相关方,会知道安装了哪个“foo”版本。这又会导致一个问题。如果我们更改了共享资源的名字,那么我们必须跟踪每个可能使用了这个共享资源的程序,当每次这个资源的新版本被安装后,都要让使用了它的程序去寻找新的资源名。这听起来很没趣。

    这就是符号链接存在至今的原因。比方说,我们安装了文件 “foo” 的 2.6 版本,它的文件名是 “foo-2.6”,然后创建了叫做 “foo” 的符号链接,这个符号链接指向 “foo-2.6”。这意味着,当一个程序打开文件 “foo” 时,它实际上是打开文件 “foo-2.6”。现在,每个人都很高兴。依赖于 “foo” 文件的程序能找到这个文件,并且我们能知道安装了哪个文件版本。当升级到 “foo-2.7” 版本的时候,仅添加这个文件到文件系统中,删除符号链接 “foo”,创建一个指向新版本的符号链接。这不仅解决了版本升级问题,而且还允许在系统中保存两个不同的文件版本。假想 “foo-2.7” 有个错误(该死的开发者!),那我们得回到原来的版本。一样的操作,我们只需要删除指向新版本的符号链接,然后创建指向旧版本的符号链接就可以了。

    在上面列出的目录(来自于 Fedora 的 /lib 目录)展示了一个叫做 “libc.so.6” 的符号链接,这个符号链接指向一个叫做 “libc-2.6.so” 的共享库文件。这意味着,寻找文件 “libc.so.6” 的程序,实际上得到是文件 “libc-2.6.so”。在下一章节,我们将学习如何建立符号链接。

    拓展阅读