作者:未知
出处:https://osu.redhat.com/content/courses-zh-cn/rha030-4/section_0001/tag_lessons/section_0003
三、查看文件系统
主要概念
讨论
文件和目录的命名
在 Linux 中,信息和程序作为文件储存在磁盘上。文件被归类到目录中,目录中包含文件和其它目录。(其它操作系统经常将目录称为“文件夹”。)这种包括多层次目录的目录结构经常被称为“目录树(directory tree)”。
目录树的根部是名为 / 的目录,被称作“根目录(root directory)”。根目录中的文件被称作 /filename。在红帽企业版 Linux 中,根目录下主要是其它目录,如 /etc。这些次目录中的文件被称作 /etc/filename,目录树的每一层都是如此命名的。例如,文件 network 位于目录 sysconfig 中,这个目录位于 etc 中,而 etc 目录又位于 / 中,那么文件的引用为 /etc/sysconfig/network。
显然,每次都从根目录开始引用文件会很麻烦,幸运的是,Linux 提供了一种更简便的方式。每个进程,包括用户的 shell,都用“当前工作目录(current working directory)”作为环境。位于进程当前工作目录的文件可以被直接引用为 filename,前面不用加斜线。位于当前工作目录的次目录中的文件可引用为 dirname/filename,前面也不用加斜线。举例来说,如果进程的当前工作目录是 /etc,前面提到的文件 network,可以被引用为 sysconfig/network。如果工作目录是 /etc/sysconfig,那么这个文件就可以简单地引用为 network。
总而言之,引用文件的方式有两种。相对于根目录的文件引用总是以 / 开头,这种引用方式叫做绝对引用。相对于当前工作目录的文件引用不以 / 开头,这种引用方式叫做相对引用。
用 ls 列出目录内容
用户从 shell 使用命令 ls 列出目录的内容。(ls 是动词 “list(列出)”的缩写。)在下面的例子中,用户 elvis 想列出目录 /etc/sysconfig/rhn 的内容。
[elvis@station elvis]$ ls /etc/sysconfig/rhn
rhn-applet systemid up2date-keyring.gpg up2date-uuid
rhnsd up2date up2date.rpmnew
在没有参数的情况下((即,不指定目录))调用 ls 命令时,该命令列出 shell 当前工作目录的内容。如果使用彩色终端,ls 还会以不同颜色显示文件名,帮助区分常规文件(白色)和目录(蓝色)。
ls 是一个非常灵活的命令,可以提供大量不同的信息,这将在以后的课程中详细讨论。
用 cat 查看文件内容
ls 命令显示一个给定目录中所含的文件,但不会显示这些文件的内容。有几个命令可用来浏览文件内容,最简单的是 cat 命令。给这个命令一个文件列表,它会将这些文件并置(concatenates)到终端输出。如果只给出一个文件名,文件的内容会作为输出显示出来。
在下面的例子中,用户 elvis 想浏览配置文件 /etc/hosts 的内容。
[elvis@station elvis]$ cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
192.168.0.254 server1.example.com server1
192.168.0.1 station1.example.com station1
现在不必担心文件的内容是什么,只要意识到命令 cat 可以显示文件的全部五行内容就可以了。
如果你指示 cat 显示一个很长的文件或二进制(非文本)文件,cat 也会照常执行。还有更先进的浏览大型文件的命令,可以逐页浏览,这将在以后介绍。
将命令输出重定向到文件中
当执行 ls 和 cat 命令时,命令的输出在终端上显示。在 Linux 系统内,大部分生成文本输出的命令都会使用一个常用的 Unix 概念,叫做“标准输出(standard out)”流。在默认状态下,这个数据流连接到终端。bash shell 允许用户将标准输出流“重定向“(redirect)到其它地点。我们现在只学习最简单的方法,使用 > 将标准输出重定向到文件中。
在下面的例子中,用户 elvis 要再次列出目录 /etc/sysconfig/rhn 的内容,但是这次他把输出重定向到一个新建的文件中。
[elvis@station elvis]$ ls /etc/sysconfig/rhn > lsout.txt
[elvis@station elvis]$ ls
lsout.txt
[elvis@station elvis]$ cat lsout.txt
rhn-applet
rhnsd
systemid
up2date
up2date-keyring.gpg
up2date.rpmnew
up2date-uuid
命令 ls /etc/sysconfig/rhn 的输出没有在终端上显示,而是保存到一个名为 lsout.txt 的新建文件中。elvis 接着在当前工作目录上使用 ls,查看这个新建的文件,再使用命令 cat 浏览文件内容。用 Unix 的说法就是,elvis “将命令 ls 的输出重定向到文件 lsout.txt 中。”
权限和用户的主目录。
注意,如果 elvis 试图把输出重定向到 shell 当前工作目录以外的文件中,会出现什么情况。
[elvis@station elvis]$ ls /etc/sysconfig/rhn > /etc/lsout.txt
-bash: /etc/lsout.txt: No such file or directory
用户 elvis 会遇到另一个常见的 Linux 概念:文件所有权和权限。elvis 试图创建新文件 /etc/lsout.txt,但是他没有在目录 /etc 中创建文件的权限。
在默认情况下,红帽企业版 Linux 不允许用户随便在任意地点新建文件。事实上,能够新建文件的地点只有几个。每个用户都有主目录,他们可以在那里创建新文件(和次目录)。幸运的是,当用户 登录到 Linux 会话时,shell 将用户的主目录作为它的当前工作目录。默认情况下,在红帽企业版 Linux 里,用户的主目录被命名为 /home/username,username 用用户的用户名代替。
以后的教程中会详细讨论文件系统和权限。现在只需知道,用户一般只能在自己的主目录中创建文件。
Examples
将命令输出重定向到文件中。
用户 prince 想用 cal 命令将本月的日历保存到文件 calendar.txt 中。
[prince@station prince]$ cal 1
May 2003
Su Mo Tu We Th Fr Sa
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
[prince@station prince]$ cal > calendar.txt 2
[prince@station prince]$ ls 3
calendar.txt
[prince@station prince]$ cat calendar.txt 4
May 2003
Su Mo Tu We Th Fr Sa
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
练习
ls 命令
[Warning] 上机练习
练习目的:将命令输出重定向到新建文件中。
Estimated Time: 5 mins.
具体操作
使用 ls 命令列出目录 /etc 的内容,将命令的输出重定向到你的主目录下名叫 lsetc.txt 的文件中。
结果
A title
Question 1
参考答案
以下命令是这个练习的参考答案。
[student@station student]$ ls /etc > lsetc.txt
问题
多项选择题
A title
Question 1
假设 shell 的当前工作目录是 /home/elvis,以下哪个是文件 /home/elvis/Mail/sent 的引用?
Question 2
用户 elvis 的 shell 当前工作目录是 /home/elvis,以下哪个是文件 received 的引用?这个文件位于主目录下的 Mail 目录中。
Question 3
以下哪个命令会列出目录 /usr/lib 中的文件?
Question 4
以下哪个命令会成功地把命令 cal 的输出重定向到文件 lsout.txt 中?
Question 5
用户 elvis 的主目录是 /home/elvis,以下哪个命令可以成功地在默认的红帽企业版 Linux 系统上运行?