现在我们知道了如何在文件系统中移动,是时候对我们的Linux系统进行导览(guided tour)了。然而,在我们开始之前,我们将学习一些在此过程中有用的命令。
ls
—— 列出目录中的内容file
—— 确定文件类型less
—— 查看文件内容ls
一起享受更多乐趣ls
命令可能是最常用的Linux命令,这是有充分理由的。通过它,我们可以查看目录内容并确定各种重要的文件和目录属性。正如我们所看到的,我们可以简单地输入 ls
来获取当前工作目录中包含的文件和子目录的列表:
xxxxxxxxxx
[me@linuxbox ~]$ ls
Desktop Documents Music Pictures Public Templates Videos
除了当前的工作目录,我们还可以指定一个要列出的目录,如下所示:
xxxxxxxxxx
[me@linuxbox ~]$ ls /usr
bin games include lib local sbin share src
我们甚至可以指定多个目录。在下面的示例中,我们列出了用户的主目录(由“~”字符表示)和 /usr 目录:
xxxxxxxxxx
[me@linuxbox ~]$ ls ~ /usr
/home/me:
Desktop Documents Music Pictures Public Templates Videos
/usr:
bin games include lib local sbin share src
我们还可以更改输出的格式以显示更多细节:
xxxxxxxxxx
[me@linuxbox ~]$ ls -l
total 56
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Desktop
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Documents
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Music
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Pictures
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Public
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Templates
drwxrwxr-x 2 me me 4096 2017-10-26 17:20 Videos
通过在命令中添加 -l
,我们将输出更改为长格式。
这就引出了一个非常重要的问题,即大多数命令是如何工作的。命令后面通常有一个或多个修改其行为的选项(options),此外还有一个或几个参数(arguments),即命令所作用的项目。所以大多数命令看起来都像这样:
command -options arguments
大多数命令使用的选项由一个字符和一个破折号组成,例如 -l
。然而,许多命令,包括GNU项目中的命令,也支持长选项(long options),由一个单词前两个破折号组成。此外,许多命令允许将多个短选项串在一起。在下面的示例中, ls
命令有两个选项,一个是用于生成长格式输出的 l
选项,另一个是按文件修改时间对结果进行排序的 t
选项:
xxxxxxxxxx
[me@linuxbox ~]$ ls -lt
我们将添加长选项 --reverse
来颠倒排序顺序:
xxxxxxxxxx
[me@linuxbox ~]$ ls -lt --reverse
请注意,命令选项像Linux中的文件名一样是区分大小写的。
ls
命令有很多可能的选项。最常见的见表3-1。
表3:常用的 ls
选项
选项 | 长选项 | 描述 |
---|---|---|
-a | --all | 列出所有文件,即使是那些名称以句点开头的文件,这些文件通常不会列出(即隐藏)。 |
-A | --almost-all | 类似于上面的-a选项,但不列出 . (当前目录)和 .. (父目录)。 |
-d | --directory | 通常,如果指定了目录,ls 将列出目录的内容,而不是目录本身。将此选项与 -l 选项结合使用,可以查看有关目录的详细信息,而不是其内容。 |
-F | --classify | 此选项将在每个列出的名称末尾附加一个指示符字符。例如,如果名称是目录,则使用正斜杠(/)。 |
-h | --human-readable | 在长格式列表中,以人类可读的格式而不是字节显示文件大小。 |
-l | 以长格式显示结果。 | |
-r | --reverse | 以相反的顺序显示结果。通常,ls 按字母升序显示其结果。 |
-S | 按文件大小对结果进行排序。 | |
-t | 按修改时间排序。 |
正如我们前面看到的, -l
选项使 ls
以长格式显示其结果。这种格式包含了大量有用的信息。以下是早期Ubuntu系统的 Examples 目录:
xxxxxxxxxx
-rw-r--r-- 1 root root 3576296 2017-04-03 11:05 Experience ubuntu.ogg
-rw-r--r-- 1 root root 1186219 2017-04-03 11:05 kubuntu-leaflet.png
-rw-r--r-- 1 root root 47584 2017-04-03 11:05 logo-Edubuntu.png
-rw-r--r-- 1 root root 44355 2017-04-03 11:05 logo-Kubuntu.png
-rw-r--r-- 1 root root 34391 2017-04-03 11:05 logo-Ubuntu.png
-rw-r--r-- 1 root root 32059 2017-04-03 11:05 oo-cd-cover.odf
-rw-r--r-- 1 root root 159744 2017-04-03 11:05 oo-derivatives.doc
-rw-r--r-- 1 root root 27837 2017-04-03 11:05 oo-maxwell.odt
-rw-r--r-- 1 root root 98816 2017-04-03 11:05 oo-trig.xls
-rw-r--r-- 1 root root 453764 2017-04-03 11:05 oo-welcome.odt
-rw-r--r-- 1 root root 358374 2017-04-03 11:05 ubuntu Sax.ogg
下面来看看一个文件的不同字段及其含义:
-rw-r--r--
文件的访问权限。
d
表示目录。第9章“权限”更详细地讨论了这一点的全部含义。
1
文件的硬链接数量。请参阅本章后面的【符号链接】和【硬链接】部分。
root
文件所有者的用户名。
root
拥有该文件的组的名称。
32059
以字节方式显示的文件大小。
2017-04-03 11:05
文件最后一次修改的日期和时间。
oo-cd-cover.odf
文件名
file
确定文件类型在我们探索系统时,了解包含哪种数据文件将非常有用。为此,我们将使用 file
命令来确定文件的类型。正如我们之前讨论的,Linux中的文件名不需要反映文件的内容。虽然名为 picture.jpg 的文件通常应包含JPEG压缩图像,但在Linux中不需要。我们这样调用 file
命令:
xxxxxxxxxx
file filename
调用时,file
命令将打印文件内容的简要描述。例如:
xxxxxxxxxx
[me@linuxbox ~]$ file picture.jpg
picture.jpg: JPEG image data, JFIF standard 1.01
文件有很多种。事实上,类Unix操作系统(如Linux)的基本思想之一是“一切都是文件”。当我们继续上课时,我们会看到这句话有多正确。
虽然我们系统上的许多文件都是熟悉的,例如MP3和JPEG,但也有许多不太明显的文件,还有一些非常奇怪。
less
查看文件内容less
命令是一个查看文本文件的程序。在我们的Linux系统中,有许多文件包含人类可读的文本。 less
程序提供了一种方便的方法来检查它们。
xxxxxxxxxx
什么是“文本”(Text)?
在计算机上表示信息的方法有很多。所有方法都涉及定义信息和用于表示信息的一些数字之间的关系。毕竟,计算机只理解数字,所有数据都转换为数字表示。
其中一些表示系统(representation systems)非常复杂(如压缩视频文件),而另一些则相当简单。最早和最简单的一种称为ASCII文本。ASCII(发音为“As Key”)是美国信息交换标准代码(American Standard Code for Information Interchange)的缩写。这是一种简单的编码方案,最初在电传打字机上用于将键盘字符映射到数字。
文本是字符到数字的简单一对一映射。它非常紧凑。50个字符的文本转换为50个字节的数据。重要的是要理解【文本只包含字符到数字的简单映射】。它与由Microsoft word或LibreOffice Writer创建的文字处理器文档不同。与简单的ASCII文本相比,这些文件包含许多非文本元素,用于描述其结构和格式。纯ASCII文本文件仅包含字符本身和一些基本的控制代码,如制表符、回车符和换行符。
在整个Linux系统中,许多文件以文本格式存储,并且有许多Linux工具可以处理文本文件。甚至Windows也认识到这种格式的重要性。著名的NOTEPAD.EXE程序是一个用于纯ASCII文本文件的编辑器。
我们为什么要检查文本文件?因为许多包含系统设置的文件(称为 configuration files ,配置文件)都是以这种格式存储的,能够读取它们可以让我们了解系统是如何工作的。此外,系统使用的一些实际程序(称为 scripts ,脚本)以这种格式存储。在后面的章节中,我们将学习如何编辑文本文件以修改系统设置和编写我们自己的脚本,但现在我们只会看看它们的内容。
less
的命令是这样使用的:
less filename
一旦启动, less
程序允许我们在文本文件中前后滚动。例如,要检查定义所有系统用户帐户的文件,请输入以下命令:
xxxxxxxxxx
[me@linuxbox ~]$ less /etc/passwd
一旦启动 less
程序,我们就可以查看文件的内容。如果文件超过一页,我们可以上下滚动。要退出 less
,请按 q 键。
下表列出了 less
使用的最常见的键盘命令。
键盘命令 | 动作 |
---|---|
PageUP 或 b | 向后滚动一页(上一页) |
PageDown 或 Space | 向前滚动一页(下一页) |
↑ | 向上滚动一行 |
↓ | 向下滚动一行 |
G | 移动到text文件的末尾 |
g 或 1G | 移动到text文件的开始 |
/ 字符 | 向前搜索下一个 字符 |
n | 搜索上一次搜索的下一个匹配项 |
h | 显示帮助屏幕 |
q | 退出 less |
xxxxxxxxxx
少即是多
less程序被设计为早期Unix程序more的改进替代品。“less”这个名字是对现代主义建筑师和设计师的座右铭“少即是多”这一短语的巧妙运用。
less的是被称为“pagers”的程序,这些程序允许以逐页的方式轻松查看长文本文档。more程序只能向前翻页,而less程序允许向前和向后翻页,并且还具有许多其他功能。
【pager
,分屏显示文本内容的用户级实用程序】
【在不同系统中,less
和 more
命令的实际效果可能不同,也可能相同。在FreeBSD中,这两个命令的输出结果是相同的;在debian中,退出 less
后屏幕上不再显示该命令执行的结果,而退出 more
后会保留刚刚显示的内容。】
Linux系统上的文件系统布局与其他类Unix系统上的布局非常相似。该设计实际上是在一个名为Linux文件系统层次结构标准(Linux Filesystem Hierarchy Standard)的已发布标准中指定的。并非所有Linux发行版都完全符合标准,但大多数都非常接近。
接下来,我们将自己浏览文件系统,看看是什么让我们的Linux系统运行。这将给我们一个练习导航技能的机会。我们将发现的一件事是,许多有趣的文件都是纯人类可读的文本。当我们进行旅行时,请尝试以下操作:
cd
进入一个给定的目录ls -l
命令列出目录中的内容file
命令探测一下它的内容less
命令查看它reset
命令进行恢复。记住复制粘贴技巧!如果您使用鼠标,可以双击文件名进行复制,然后单击鼠标中键将其粘贴到命令中。
当我们四处闲逛时,不要害怕看东西。普通用户基本上被禁止把事情搞砸。这是系统管理员的工作!如果一个命令抱怨了什么,请继续处理其他事情。花点时间四处看看。这个系统是我们探索的。记住,在Linux中,没有秘密!
表3-4仅列出了我们可以探索的几个目录。根据我们的Linux发行版,可能会有一些细微的差异。不要害怕环顾四周,尝试更多!
目录 | 解释 |
---|---|
/ | 根目录。一切开始的地方。 |
/bin | 包含系统启动和运行时必须存在的二进制文件(程序)。 请注意,现代Linux发行版已经弃用 /bin ,转而使用 /usr/bin(见下文)。 |
/boot | 包含Linux内核、初始RAM磁盘映像(用于启动时所需的驱动程序)和引导加载程序。 有趣的文件: ● /boot/grub/grub.cfg 或 menu.lst ,用于配置引导加载程序。 ● /boot/vmlinuz (或类似的东西),Linux内核 |
/dev | 这是一个包含设备节点(device nodes)的特殊目录。 “一切都是文件”也适用于设备。 这里是内核维护它所理解的所有设备的列表的地方。 |
/etc | /etc 目录包含所有系统范围的配置文件。它还包含一组shell脚本,这些脚本在启动时启动每个系统服务。此目录中的所有内容都应该是可读文本。 有趣的文件:虽然 /etc 中的所有内容都很有趣,但这里有一些最受欢迎的文件: ● /etc/crontab ,在使用 cron 程序的系统上,此文件定义了自动作业何时运行。● /etc/fstab ,存储设备及其相关挂载点的表。 ● /etc/passwd ,用户帐户列表。 |
/home | 在正常配置中,每个用户在 /home 中都有一个目录。 普通用户只能在其主目录中写入文件。此限制保护系统免受错误用户活动的影响。 |
/lib | 包含核心系统程序使用的共享库文件。 这些类似于Windows中的动态链接库(DLL)。在现代发行版中,此目录已被弃用,取而代之的是 /usr/lib 。 |
/lost+found | 使用Linux文件系统(如ext4)的每个格式化分区或设备都将具有此目录。它用于从文件系统损坏事件中部分恢复的情况。 除非我们的系统发生了非常糟糕的事情,否则此目录将保持为空。 |
/media | 在现代Linux系统上,/media 目录将包含插入时自动挂载的可移动媒体(如USB驱动器、CD-ROM等)的挂载点。 |
/mnt | 在较旧的Linux系统上,/mnt 目录包含手动挂载的设备的挂载点。 |
/opt | /opt 目录用于安装“可选”(optional)软件。这主要用于存放可能安装在系统上的商业软件产品。 |
/proc | /proc 目录是特殊的。从存储在硬盘上的文件的意义上讲,它不是一个真正的文件系统。相反,它是由Linux内核维护的虚拟文件系统。它包含的“文件”是内核本身的窥视孔。 这些文件是可读的,可以让我们了解内核如何看待计算机。浏览此目录可以显示有关计算机硬件的许多详细信息。 |
/root | root账号的主目录 |
/run | 这是传统 /tmp 目录的现代替代品(见下文)。与 /tmp 不同, /run 目录是使用 tempfs 文件系统类型挂载的,该类型将其内容存储在内存中,而不是物理磁盘上。 |
/sbin | 此目录包含“系统”二进制文件。这些程序执行通常为超级用户保留的重要系统任务。请注意,现代Linux发行版已经弃用 /sbin ,转而使用 /usr/sbin (见下文)。 |
/sys | /sys 目录包含有关内核检测到的设备的信息。这很像 /dev 目录的内容,但更详细,包括实际硬件地址。 |
/tmp | /tmp 目录用于存储各种程序创建的临时文件。 某些发行版在每次重新启动系统时都会清空此目录。 |
/usr | /usr 目录树可能是Linux系统上最大的目录树。它包含普通用户使用的所有程序和支持文件。 |
/usr/bin | /usr/bin 包含Linux发行版安装的可执行程序。这个目录包含数千个程序并不罕见。 |
/usr/lib | /usr/bin 中包含程序的共享库。 |
/usr/local | /usr/local 树是安装未包含在发行版中但打算在系统范围内使用的程序的地方。 从源代码编译的程序通常安装在 /usr/local/bin 中。 在新安装的Linux系统上,此树存在,但在系统管理员将内容放入其中之前,它将是空的。 |
/usr/sbin | 包含更多系统管理程序。 |
/usr/share | /usr/share 包含 /usr/bin 中程序使用的所有共享数据。 这包括默认配置文件、图标、屏幕背景、声音文件等。 |
/usr/share/doc | 系统上安装的大多数软件包都会包含某种文档。在 /usr/share/doc 中,我们将找到按包组织的文档文件。 |
/var | 除了 /tmp 和 /home 之外,到目前为止我们查看的目录保持相对静态,也就是说,它们的内容不会改变。/var 目录树是存储可能更改的数据的地方。各种(various)数据库、假脱机文件、用户邮件等都位于此处。 |
/var/log | /var/log 包含日志文件,各种系统活动的记录。这些都很重要,应不时加以监测。 最有用的是 /var/log/messages 和/或 /var/log/syslog ,尽管它们并非在所有系统上都可用。 请注意,出于安全原因,某些系统只允许超级用户查看日志文件。 |
~/.config ~/.local | 这两个目录位于每个桌面用户的主目录中。它们用于存储桌面应用程序的用户特定配置数据。 |
当我们环顾四周时,我们可能会看到一个目录列表(例如在 /usr/lib 中),其中包含这样的条目:
xxxxxxxxxx
lrwxrwxrwx 1 root root 11 2007-08-11 07:34 libc.so.6 -> libc-2.6.so
请注意,列表的第一个字母是 l
,条目似乎有两个文件名?这是一种特殊的文件,称为符号链接(symbolic link ,也称为软链接,soft link 或 sym-link)。在大多数类Unix系统中,一个文件可以被多个名称引用。虽然其价值可能并不明显,但它确实是一个有用的功能。
想象一下这个场景:一个程序需要使用名为 foo 的文件中包含的某种共享资源,但 foo 有频繁的版本更改。最好在文件名中包含版本号,这样管理员或其他相关方就可以看到安装了哪个版本的 foo 。这带来了一个问题。如果我们更改共享资源的名称,我们必须跟踪可能使用它的每个程序,并在每次安装新版本的资源时更改它以查找新的资源名称。听起来一点也不好玩。
这就是符号链接拯救世界的地方。假设我们安装了2.6版本的 foo ,其文件名为 foo-2.6 ,然后创建了一个名为 foo 的符号链接,指向 foo-2.6。这意味着当程序打开文件 foo 时,它实际上是在打开文件 foo-2.6 。现在大家都很高兴。依赖 foo 的程序可以找到它,我们仍然可以看到实际安装的版本。当需要升级到 foo-2.7 时,我们只需将文件添加到系统中,删除符号链接 foo ,并创建一个指向新版本的新链接。这不仅解决了版本升级的问题,还允许我们在机器上保留两个版本。想象一下,foo-2.7 有一个bug(该死的开发人员!),我们需要恢复到旧版本。同样,我们只需删除指向新版本的符号链接,并创建指向旧版本的新符号链接。
本节开头的目录列表(来自Fedora系统的 /usr/lib 目录)显示了一个名为 libc.so.6 的符号链接,该链接指向一个称为 libc-2.6.so 的共享库文件。这意味着查找 libc.so-6 的程序实际上会得到文件 libc-2.6.so 。我们将在下一章学习如何创建符号链接。
当我们讨论链接时,我们需要提到的是,还有第二种类型的链接,称为硬链接(hard link)。硬链接也允许文件有多个名称,但它们的方式不同。我们将在下一章中更多地讨论符号链接和硬链接之间的区别。
随着我们的旅行结束,我们对我们的系统了解了很多。我们已经看到了各种文件和目录及其内容。我们应该从中吸取的一点是系统的开放性。在Linux中,有许多重要的文件是人类可读的文本。与许多专有系统不同,Linux使所有内容都可供检查和研究。