mp77的UNIX课件笔记(5)

原定本章介绍Unix的两个重要文本编辑程序——Vi和Emacs,但由于本系列篇幅限制不可能对这两种软件(尤其是后者)进行足够详细的讨论。事实上如果不能深入研究Emacs的话那么对我们来说是没有任何意义的,因此该部分内容被移至系列的最后进行讨论。 本章开始我们将进入UNIX文件系统进行深入研究。

1 一些基本问题

在UNIX系统中,几乎所有的数据、信息和计算机指令等等都以文件形式存储在外存secondary storage(also called auxiliary storage,vis a vis main memory)中,所有文件都是以目录为单位进行收集和组织的。在多用户系统(Multi-User)中,每一位用户都拥有自己独立的主目录。UNIX的用户和系统管理员按照等级树管理相应的文件或目录。 当一名用户登录系统时,默认目录为用户的主目录,如果要显示当前工作目录,可以输入:

pwd

即打印当前工作目录(acronym for Print Work Directory)。 UNIX是对大小写敏感的操作系统,而Windows并无这方面的要求。

1.1 UNIX的文件类型

UNIX的文件类型可以分为三大类别,分别是普通类型、目录类型以及特殊文件类型。 普通类型包括ASCII文本、可执行程序(executable)、图像(jpeg)文件或html文件等等。 目录类型,例如用户主目录~/.。 特殊文件类型,UNIX中一种独特的文件类型。一类是硬件设备,例如/dev/lp0,一般接打印机等设备。另一类是逻辑设备,这里介绍两种UNIX常用的逻辑设备: /dev/null,它有一个形象的名字“黑洞”,即可以接受任何数据,而这些数据将不会在其它I/O操作中显示。例如:

netstat –an &> /dev/null

这时标准输出中不会显示任何信息,>是重定向标示符,我们可能在msdos中遇到过command > filename的情况,事实上其原理是一致的。另外还有一个相对应的>>意在filename末尾添加信息。&表示标准输出和标准错误信息,如果仅仅想对标准输出信息进行操作可用1替换&,如果只想屏蔽标准错误可输入2。 /dev/zero,这是一种与/dev/null似乎完全相反的文件,它代替了一种标准输入,且此类输入仅仅包含二进制0,其ASCII字符为null。现在来看一种应用示例:

dd if=/dev/zero of=swap bs=1024 count=40

dd是UNIX命令,其作用是自定义一个输入流和一个输出流,并借此实现数据I/O。if指定输入流,此处来源/dev/zero。of指定输出流,此处定义名为swap的文件,bs即blocksize定义块大小,count定义块个数。执行此命令后,系统会建立一个名为swap的文件,此文件是由40个大小为1024字节且内容全部为null的空文件。 以上两种文件类型在UNIX系统中起到了至关重要的作用。/dev/null主要应用于shell脚本,也几乎是shell脚本编程中最常使用的重定向输出之一。/dev/zero的用途更为广泛,系统管理员可以使用该功能为系统建立临时的交换文件(或称交换分区),因为其良好的结构恰恰对应与内存管理,因此可以明显提升某些数据服务器的工作效率。

1.2 目录和文件的表示方法

UNIX的目录管理是典型的树形结构,这里不再赘述。其命名规则并不很严格,大多支持200字符以上的长文件名,一个特点是除斜线slash(不包括backslash)以外的字符几乎都是合法被接受的(包括不可打印字符)。 在shell中表示路径,可以采用/usr/home/guest/.profile的绝对路径(absolute)表示,也可以采用../httpd/bin/apachect1的相对路径(relative)表示。其中每个目录下均包含两个目录指示符.(指当前目录)和..(指上级目录)。如果用户使用csh,还能利用~/表示用户主目录。 我们在前文提到正则表达式 (Regular expression)与通配符(wildcard)含义并不一致。这些通配符的意义是由shell程序进行分析和解释的。下面介绍几种简单的通配符: ,即任意长度字符串,唯一例外的是当表示文件名头部时无法匹配以.起始的文件,如.profile; ?,匹配任意单字符; [],匹配括号内任意字符,也可以指定其范围。但[A-Z]*并不和正则表达式中的本式等同,这点需要注意。 仍需补充的是,shell在处理含通配符或者多个项的命令时,一般先将目标目录下的文件名按字典顺序排序,然后逐一查找,因此输出的最终结果也是按字典序排序的。

2 UNIX文件系统命令

2.1 查看目录信息ls

ls

ls即list,列出当前目录的内容,同一个目录下即可能有文件,也可能有子目录,然而当单独使用ls时并不能对此类信息作出区分。 ls有很多选项,且大多数都经常会用到,因此掌握ls是UNIX系统管理员的基本功之一。下面列出一些非常实用的ls选项: -a,列出所有本目录下文件,并包括所有文件名以.起始的文件。在UNIX中此类文件即是隐藏的,也就是说在不带-a的情况下ls无法查看这些隐藏文件。常见的隐藏文件如.profile、.bashrc等都是默认于用户主目录下,存储了该用户的自配置信息。 -l,以长格式显示UNIX的文件类型、权限、硬连接数(hard links,后文介绍)、拥有者、拥有者所属组、大小、最后一次修改时间以及文件名等等。 -F,在文件的尾部添加特殊字符以代表其文件类型,例如*表示可执行文件,/表示目录。 -R,同时列出所有的子目录信息。 -d,列出目录内容的同时显示符号连接或目录的信息,包括了连接的目标并列出目录的内容。 -I,列出所有文件的i-node号。 现在我们给出执行ls –la命令后的结果示例: -rw——- 1 gambill cls 10868 Jan 14 08:44 vm_mail drwxr-xr-x 2 gambill stdt 96 Jun 13 1999 wvannot 给出信息的第一列记录了文件类型和相关权限。其第一位字符通常表示文件类型,当文件类型为-时表示文本文件、可执行文件或硬连接文件;d表示目录;另外还有一些其它的文件类型标识,例如b块设备文件、l符号连接文件等等。 第一列剩余的9位字符记录了该文件的许可权限,其中每三位分别记录r读、w写和x可执行三类权限,并相应于文件所有者、该文件所属的组、以及其他任何人的权限。第三列是指当前文件的连接数,gambill是文件的所有者、其后即gambill所在的组。然后是文件的大小(以bytes为单位)、最后一次修改时间以及其文件名。

2.2 文件复制cp

cp option file1 file2

cp命令首先创建file2,然后将file1的数据拷贝至file2中。如果file2已存在,则覆盖源文件。选项i即当目标文件已存在时首先提示用户是否覆盖源文件,选项r支持拷贝目录及其全部内容至目标目录。

2.3 文件转移mv

mv option file1 file2

mv可以将file1移至file2,同时删除原有file1文件。mv一个常用场合是在修改文件名的时候。使用选项i可在当file2已存在时询问用户是否覆盖源文件。

2.4 文件删除rm

rm option files

rm命令删除files中列出的所有文件。选项i依然是在删除前询问用户是否删除该文件,选项r删除一个目录下的文件,并且删除其子目录下的所有文件,还有一个常用选项f即强制删除该文件且不用提示用户是否确认。 当用户确认要删除一个目录时,最好的办法是使用rm –rf来实现。 前面提到UNIX的文件名除字符slash外均可使用,假设pwd下某文件名为-i,那么按原方法应执行rm –i,鉴于i是rm的选项之一,因此这条command显然无法满足要求。因此大部分时间我们习惯将路径用.标识符标识:

rm ./-i

以上操作是没有任何问题的,但当我们使用grep搜索字符串-regulation时类似问题再次出现,且无法利用上述办法解决。为此UNIX的大部分命令约定–为选项域结束标志,那么这之后的-XXX就不会再被列入选项列表了,例如:

rm – -i

2.5 文件查找find

find的功能是在类UNIX平台上通过目录查找目标文件,它可以根据指定的目录信息,以及用户定制的规则(Criteria,plurality for Criterion)查找相对应的文件。不仅如此,find还允许用户定制对目标文件进行操作。

find verl.d ver2.d -name ‘*.c’ -print

以上是一个find应用示例,其选项含义如下: -name,文件名的匹配,允许使用文件名通配符 *、?和[ ],文件名通配符描述串传递到find程序中,因此,应当用引号括起来,以免被shell展开。 -type,类型,其中f:普通文件,d:目录,l:符号连接文件,c:字符设备文件,b:块设备文件,p:管道文件,如:-type d。 -size,±n[c],文件大小,正号表示大于,负号表示小于,无符号表示等于,其他与数量有关的选项,也采用这样的方式。 -size +100 表示长度大于100块; -size -100 长度小于100块; -size +100000c 表示长度大于100000字节; -size -100000c 表示长度小于100000字节; “操作”选项一般有以下几种常用内容: -print,打印查找到的符合条件的文件的路径名。 -exec,-ok,对查找到的符合条件的文件执行某个命令。

2.6 当前工作目录pwd

pwd即print working directory。如果要选择进入不同目录,需要使用cd dname。

2.7 创建目录mkdir

mkdir dname

在当前目录下创建新目录dname,相应还有一种删除目录rmdir,但由于rmdir只能够删除内容仅含..的目录,因此实际用途并不如rm -rf广泛。

2.8 打包压缩工具tar和compress

tar我们在连载三已有详细介绍,读者可前往查看: http://www.hanyi.name/blog/?p=161 compress是早期UNIX的文件压缩工具,其相应的解压程序为uncompress,但随着gnuzip等更强大软件的出现此类工具已逐渐被淘汰,事实上近年来的发行版中均未附带compress工具。

下一章我们将讨论UNIX文件系统的有关内容。