1.3 目录
系统可以把你的文件(如名为junk的文件)同任何其他人的相同名称的文件区分开。这个区分是依靠把文件分组成目录(文件夹),而不是像图书馆中那样把书放在架上,所以在不同目录中的文件可有相同的名称而不至于出现矛盾。
通常,每个用户都有其个人目录或主目录,也有时称为登录目录,其中只包含了属于用户他或她的文件。当登录时,用户在自己的目录中。用户可以改变工作用的目录—通常称为用户的工作目录或当前目录—但用户的主目录始终不会变化。除非用户采取特别的行动,当建立一个新文件时,它会建在当前目录中。由于当前目录初始装状态下亦即用户自己的主目录,文件不会同其他人的相同名称文件相关。
目录中可以包含其他的目录,当然也可包含一般的文件(“好目录中有较少的目录……”),描述这一段结构组织的自然方式是目录和文件树。可以从树根开始沿着恰当的分支移动,从而找到系统中的任何文件。相反,也可以从任何一处开始,最终到达根部。
我们先从后者开始,所用的基本工具是pwd(print working directory),它显示出用户当前所在的目录的名称:
它说明用户当前在目录you中,you在usr目录中,而usr就在根目录中,根目录通常称为“/”。/字符分隔了名称的每个部分,前面所述的14个字符的限制也适用于名称的每个部分。在很多系统中,/usr是包含系统的普通用户所有目录的一个目录。(即使用户的主目录不是/usr/you,pwd也会印出类似的内容,所以用户能够理解下面的内容是什么。)
如果用户键入
应该得到如同使用ls所得到的完全一样的名单。在没有变量提供时,ls列出当前目录的内容;在给定目录的名称时,它就列出该目录的内容。
其次,试一试:
这应该列出一串名称,其中有读者自己的登录目录。
下一步是试验列出根目录本身。可以得到一个类似于下面的响应:
(不要混淆/的两个含义:它既是根目录的名称,又是文件名的分隔符。)它们多数是目录,但unix实际是一个含有UNIX内核的可执行形式的文件。有关它的更多内容在第2章中讨论。
现在试一下:
(如果junk仍在读者的目录中。)名称:
是称为文件的路径名。路径名表征了从根通过目录树到特定文件的全部路径名。在UNIX系统中有一个通用规则,凡是可以使用普通文件名的地方,都可以使用路径名。
文件系统构造得像一个通用逻辑树,用一幅图像可能会更明晰一些:
从图1-1中可以看出,你的junk文件同Parl的或Mary的junk文件没有任何关系。
如果所关心的所有文件都在你自己的目录中,那么路径名并没有多少作用;但是如果你同其他人合作,或者同时有几个项目在进行,那么路径名就实在很有用了。例如,你的朋友可以通过如下操作显示你的junk文件:
类似地,你可以用如下操作找出Mary文件的内容:
或者对她的文件制作一份自己的副本:
或者编辑她的文件:
如果Mary不想让你随便操作她的文件,那么可以做出私用性设置。每个文件和目录都有对应所有者、组以及其他人的读-写-执行的允许权限,用以控制存取。(请回忆ls-l。)在作者的系统中,多数用户在多数时间里发现开放性还是比私用性更为有益,但是在你的系统中可能有不同的策略,有关内容会在第2章中讨论。
作为与路径名有关的最后一个实验,请试一下:
有什么名称看似熟悉吗?当在提示符后键入命令的名称,然后运行命令时,系统寻找该名称的文件。它通常先寻找当前目录(也许多数不会在此目录中),然后在/bin中寻找,最后是在/usr/bin中寻找。目录收集在一起是为了便于查询和管理。要验证这一点,通过使用它们的全路径名试验执行下面这些程序:
练习1-3 尝试:
按所要求的执行,可能会有比通常上班更为有趣的事发生。
改变目录
如果你经常与Mary一起处理她的主目录中的信息,你可以说“我打算在Mary的文件上而不是在自己文件上工作”。这是通过用cd命令改变当前目录而实现的:
现在,当你使用文件名(不带/)作为cat或pr的变量时,它会指向Mary目录中的文件。改变目录并不会影响文件有关的允许权限—如果不能从自己的目录中访问某一文件,改变至另一个目录并不能改变这一事实。
把同某一事物有关的文件都安排在一个目录中而与其他项目分隔开是会带来便利的。例如,如果某人打算写一本书,他或许会尝试把所有的文件都放在一个称为book的目录中。使用命令mkdir建立一个新的目录:
“..”表示当前所在目录的父目录,更接近根一层的目录。“.”是当前目录的同义词。
上述操作把你带回主目录,即登录目录。
一旦书出版了,就可以清除掉有关文件。要删除目录book,先删去其中的所有文件(我们会简单地展示),再用cd指向book的父目录,然后键入
rmdir只删去空目录。