| 7.2常用操作:文件处理和常用命令 7.2.1 文件的生成——编辑程序 7.2.2 文件名列表 7.2.3 打印文件——cat和pr 7.2.4 换名、复制与删除文件——mv,cp,rm 7.2.5 什么是文件名 7.2.6 一些特殊用途的命令 Linux系统的信息存放在文件里,文件与普通的公务文件类似。每个文件都有自己的名字、内容、存放地址以及其它一些管理信息,如:文件的用户,文件的大小等。文件可以是一封信,一个通讯录,或者是程序的源语句,程序的数据,甚至可以包括可执行的程序和其它非正文内容。 Linux文件系统具有良好的结构。用户可以有效地保护自己的文件,免受他人干扰。Linux系统提供了很多文件处理程序。在这里主要考察几个常用的文件处理程序和命令,关于文件系统和与文件有关的内容将在第七章中作详细介绍。 7.2.1 文件的生成——编辑程序 假如你想要键入一篇文章,一封信或一段程序,该怎样把这些信息存到计算机里呢?这些工作是由文本编辑程序完成的,编辑程序用来存储和处理计算机的信息。几乎所有的Linux系统都有屏幕编辑程序。屏幕编辑充分利用了计算机终端的功能,形象地显示了编辑过程文件内容的变化。最常见的两个屏幕编辑程序是vi和emacs。 在你的系统里,Linux传统的行编辑程序ed一定可以运行。ed是不考虑终端的特殊性的,因而它几乎可以在所有的终端上运行。ed也是很多基本程序的基础(包括一些屏幕编辑程序)。因此值得专门花些时间来讨论它。 不论使用什么样的编辑程序,都应能十分熟练地迅速地产生和编辑文件。这里以ed为例,讨论具体产生和编辑文件的步骤。 下面利用ed创建junk文件,该文件包含正文内容: $ ed 调用文本编辑程序 a ed命令,附加正文 It’s time to go to work. · 键入‘·’,终止附加命令 w junk 把正文写入junk文件 25 ed显示文件的字符数 q 退出ed $ 命令a(附加)指示ed开始收集正文。“·”表示附加正文结束,它必须键入在行首位置;注意不要忘记输入符号·。在正文结束符·输入之前,所有ed的其它命令都当作正文内容,而不作为命令解释。 w(写)命令存储所有正文内容;“w junk”把正文信息存放到文件junk中,文件名可以自己选定,这是junk表示文件内容无关紧要的意思。 文件存入后,ed回送文件的字符数目。在发w命令前,没有任何内容存到盘里。假如你在这时挂断终端,信息并没有存到指定的文件中(在编辑时挂断终端,键入的数据存到ed.hup文件里,以备下次调出继续编辑)。假如在编辑时,系统发生紊乱(因为软件或硬件的意外故障造成),编辑的文件仅仅包括上次写命令存入的部分。只有发w命令后,文件信息才能完全记录下来,这样键入下面命令,便可再次编辑文件。 $ ed junk 这样,又可对文件再次进行编辑,如改正拼写错误,修改词句,重新安排段落或做一些其它工作。当你编辑完文件,可用q(“quit”)命令退出编辑程序。 7.2.2 文件名列表 我们假设你用以下方式建立了文件junk和temp : $ ed a To be or not to be · w junk 19 q $ ed a That is the question. · w temp 22 q $ ed程序回送的字符总数包括行结束符,后者有时称为换行符,这一符号是系统处理回车符RETURN所建立的符号。 ls命令列出文件的名字(注意不是文件的内容): $ ls junk temp 列出的文件名正是刚刚建立的二个文件(可能还有早已建立的文件)。文件名按字母顺序列出。 ls命令同大多数命令一样,可以用选择项改变省缺值。选择项在命令行中的命令名后面,通常由一个前导负号‘-’加上单个字符来表示各种含义。例如,ls-t表示文件按时间顺序列出。即文件最后一次修改的时间排列,时间上修改得越靠后,顺序上排列得越靠前。 $ ls –t temp junk 选择项-l给出较长的列表形式,对每个文件提供更多的信息: $ ls –l total 2 -rw-r--r-- l frank 19 Mar 24 22:25 junk -rw-r--r-- l frank 22 Mar 24 22:26 temp “total2”表示文件总共占用盘空间2块;一般一块表示512字节或1024字节。字符串-rw-r--r--指出文件的访问许可权;这表示文件所属者(frank)可以读写,而其它用户只能读不能写。随后的“1”表示文件的连接数; “frank”是文件主,即文件的建立者;19和22是文件的字符数,它等于ed写入文件后回送的字符数;日期和时间指出文件最后一次修改的时间。 选择项可以组合起来。ls-lt给出的信息同ls-l一样,不过文件的顺序是最后修改的排在前面。选择项-u给出文件使用时间信息,ls-lut给出(-l)列表形式,而且最晚用过的排在前面。选择项-r倒转列表的次序,因此ls-lrt将最早用过的文件排在最前面。对于特别感兴趣的某一个文件,ls 也可以列出有关的信息: $ ls –l junk -rw-r--r-- 1 frank 19 Mar 24 22:25 junk 命令行中命令后面的字符串便是程序参数,上例中的-l和junk便是。参数一般是命令所要求的选择项和文件名。按照通常的惯例,选择项由负号和单个字母组成,如-t或组合形式-lt。一般来说,如果命令接收选择项参数,这些参数应放在文件名参数之前,当然它们也可能以其它次序出现。 随着深入学习,你会明白选择项参数的写法有一定的规则可循。每个命令有其独具的功能,对于每个字母有特定的解释(同一功能对于不同的命令参数往往不同)。这些不一致的选择项使系统显得很不协调,往往看作系统的一个主要弊病。这一状况正在不断改善,新的版本采用愈趋一致的选择项。 7.2.3 打印文件——cat和pr 现在你有了一些文件,怎样去查看它们的内容呢?能实现这一工作的程序很多,利用编辑程序是一种可行的方法。 $ ed junk 19 ed表示junk有19个字符 1,$p 打印第一行至最后一行 To be or not to be 文件只有一行 q 全部做完,退出ed ed开始报告文件junk的字符总数;命令l,$p表示打印整个文件。当你学会使用编辑程序后,可以只打印文件的一部分内容。 使用编辑程序打印文件往往受到一些限制:ed不能打印很大的文件,最多只能数千行;另外,一次也只能打印一个文件,而实际往往需要打印几个文件,一个接一个地不间断地打印。下面我们再提出二个打印程序供大家选择。 第一个是cat。cat是所有打印命令中最简单的一个。cat打印文件内容,文件名作为cat命令参数: $ cat junk To be or not to be $ cat temp That is the question $ cat junk temp To be or not to be That is the question 和cat一样,pr打印参数也是需要打印文件名。pr使用行打印机的打印格式:每页66行(11英寸)长,每页顶部还打印刊头,包括文件最后修改的日期和时间、页面序号及文件名。页和页之间,有若干空行,以便跳过页间走纸间隙。在下例中,先打印junk文件,然后跳到新的一页顶部,继续打印temp文件。 $ pr junk temp Mar 24 22:25 1999 junk page 1 To be or not to be (60 more blank lines) (60余行空行) Mar 24 22:26 1999 temp page 1 That is the question. (60 more blank lines) (60余行空行) pr还提供多列打印的输出格式: $ pr –3 filenames 表示以3列的格式打印文件。也可用其他的列数代替3,而使pr打印得更好看(flienames是文件名表),pr-m以并列格式打印若干个文件。 必须指出,pr不是一个排版程序,排版程序至少应该重新安排行列,重新调整边缘空白的数目。 还有使用高速打印机打印文件的命令。参阅手册里lp、lpr命令,或查索引中的printer命令。究竟使用什么命令取决于系统所接的设备。pr和lpr经常一起使用,pr设置适当的打印格式,lpr处理送往行打印机的输出。 7.2.4 换名、复制与删除文件——mv,cp,rm 下面我们逐个考察这些命令:第一个是换名。这是通过改变文件的名字进行的。如: $ mv junk precious 这一命令的作用是将原先称为junk的文件赋予新的名字precious;但文件内容不变。当再次运行ls命令,precious文件代替了junk文件。 $ ls precious temp $ cat junk can:can’t open junk 必须注意,如果把文件换名为一个已经存在的文件名,那么后者内容就不再存在了。 复制文件(使一个文件有二个文本)可使用cp命令: $ cp precious precious.save 这样,为precious拷贝了一个副本文件precious.save。 最后,当你不需要某个文件时,可用rm命令删除之。 当要删除的文件不存在时,你会得到一个出错信息;当文件存在时,大多数Linux系统将默默地执行命令。许多Linux命令没有过多的提示和回应,错误信息也相当简单,似乎没有什么帮助。这种情况对新的用户不大习惯,而对有经验的用户来说,过多的命令提示是不必要的。 7.2.5 什么是文件名 到目前为止,我们使用了一些文件名但还未交待哪些是合乎要求的文件名。现在介绍文件命名的两个规则。首先,文件名的长度要限制在14个符号以内。第二,尽管文件名几乎可用所有的符号,但一般来说文件名应该使用可见符号,并应避免使用具有其它含义的字符串。例如,在ls命令中,ls-t意味着按时间次序列出文件名。所以假使你把一个文件叫做-t,在要列该文件时,将得到按时间顺序排列的很多文件名。除了负号,还有少数几个符号在作为第一个符号时,具有特殊的意义。为了避免这类命令引起的错误,最好使用字母,数字,句点和下划线(一般习惯用句点和下划线表示把文件名字段分隔,如上述的文件名precious.save)。最后不要忘记大小写的区别——junk,Junk和JUNK是三个不同的名字。 7.2.6 一些特殊用途的命令 我们已初步讨论了文件的建立,文件名列表以及打印文件内容的方法,也提到了一部分文件处理命令。为了使进一步学习文件命令的讨论更具体,我们以poem文件作例子,它是Augustus De Morgan写的诗。 首先用ed建立文件poem: $ ed a Great fleas have little fleas upon their backs to bite’em, And little fleas have lesser fleas, and so ad infinitum. And the great fleas themselves, in turn have greater fleas to go on; while these again have greater still, and greater still, and so on. · w poem 263 q 第一个命令是wc。计算一个或若干个文件的行数,词数和字符数;因为该命令具有字计数功能,故称为wc(word-counting)。 $ wc poem 8 46 263 poem 即poem文件有8行,46个词,263个字符。词的定义很简单,不包括空白、tab和换行符的任何符号串就称之为词。 wc可以对多个文件进行计数(打印出总数),必要时可选择计数的项目。 第二个命令称为grep。对文件逐行搜索,看它是否和给定的模式匹配(grep名字来自ed命令,g/regular-expression/p,)。假如你要寻找poem中的词“fleas”,可输入: $ grep fleas poem Great fleas have little fleas And little fleas have losser fleas, And the great fleas themselves, in turn. Have greater fleas to go on; 当选择项为-v时,搜索模式不匹配的行(按照行编辑命令惯例,v是匹配的反意词)。 $ grep –v fleas poem upon their backs to bite’em, and so ad infinitum. while these again have greater still, and greater still, and so on. grep一次可搜索几个文件;这时,grep把文件名输出匹配行之前,以表明匹配行属于哪个文件。grep还有计数,序号等选择项。Grep可处理比一个词(如“fleas”)复杂的模式。 第三个命令是sort。sort按照字母顺序逐行排序。我们仍以poem为例,目的在于观察排序现象: $ sort poem and greater still, and so on. and so ad infinitum. have greater fleas to go on; upon their backs to bite’em, And little fleas have lesser fleas, And the great fleas themselves, in turn, Great fleas have little fleas while these again have greater still, 这是一个逐行排序,参数省缺时,排序以空格在前,然后大写字母,再改小写字母。sort程序实际上不受字母范围的限制。 sort有很多控制排列顺序的选择项。如:某种排序的逆序,数字次序,字典模式排序,忽略前导空格,在每行内指定排序字段等等。一般应查阅手册以明确其用法,这里仅列出几种主要的选择项: sort –r 标准排序的逆 sort –n 以数字次序排序 sort –nr 数字排序的逆 sort –f 大小写一起混合排序 sort +n 从n+1个字段开始排序 另一个文件处理命令是tail。它的缺省功能是打印文件的最后10行。对于我们8行的诗已经超过了,但对于大文件是很适用的。tail可有指定打印行数的选择项,例如我们打印poem的最末行: $ tail –1 poem and greater still, and so on. tail还可以从指定行开始打印: $ tail +3 filename 这是从第3行开始打印(注意这里违反惯例,使用正号作命令参数)。 最后要介绍的两个命令都是文件比较命令cmp和 diff。 假定我们另有一个与poem稍有不同的文件new-poem: $ cat poem Great fleas have little fleas upon their backs to bite’em, And little fleas have lesser fleas, and so adinfinitum. And the great fleas themselves, in turn, have greater fleas to go on; while these again have greater still, and greater still, and so on. $ cat new-poem Great fleas have little fleas upon their backs to bite them, And little fleas have lesser fleas, and so on ad infinitum. And the great fleas themselves, in turn, have greater fleas to go on; while these again have greater still, and greater still, and so on. 这两个文件只有微细的差别;事实上很难找出它们的差异所在。利用文件比较程序便可方便地找出它们的差异。cmp命令找出了第一个不同点: $ cmp poem new-poem poem new-poem differ: char 58, line 2 就是说二个文件的第二行不同,这是正确的。但是命令cmp既没有指出它们的差别是什么,也没有有指出除第一处不同外是否还有其他的存在。 另一个文件比较命令为diff,它指出所有改动过、增加的或删除的行。 $ diff poem new-poem 2c2 < upon their backs to bite’em, --- > upon their backs to bite them, 4c4 < and so ad infinitum. --- > and so on ad infinitum 它指出第一个文件(poem)的第二行与第二个文件(new-poem)的第二行的不同点,对于第四行也作类似的处理。 一般来说,cmp用于检查两个文件是否完全相同。cmp运行得很快,可对任何类型的文件均可进行比较,而不局限于正文text文件。diff用于找寻文件的不同点,使你确切知道有哪些不同。diff文件只适用于正文文件。 下表是我们对这一节介绍的命令作一个小结: 常用文件管理命令 ls 列出当前目录的文件名 ls filenames 只列出指定的文件 ls –t 按时间次序列表,时间最近的文件排在最前面。 ls –l 长列表:包括较多信息;还可用ls-lt。 ls –u 按最后使用的时间次序列表;也可用ls-lu, ls-lut。 ls –r 以逆序列出文件名;可组成-rt,-rlt,等等。 ed filename 编辑文件 cp file1 file2 把file1拷贝到file2。若file2存在,则覆盖file2。 mv file1 file2 文件file1换名为file2,若file2存在,则覆盖file2。 rm filename 删除文件,不能挽回。 cat filenames 打印文件内容。 pr filenames 按打印机格式打印文件,每页66行。 pr –n filenames 以n列形式打印文件内容 pr –m filenames 并排打印指定的若干文件(多列打印) wc filenames 计数文件的行,词和字符数。 wc –l filenames 计数每个文件的行数。 grep pattern filenames 打印模式匹配的行 grep -v pattem files 打印模式不匹配的行 sort filenames 逐行以字母顺序排序 tail filename 打印文件最后10行 tail -n filename 打印文件最后n行 tail +n filename 从第n行开始打印 cmp file1 file2 打印二个文件差异第一处 diff file1 file2 打印二个文件所有不同之处 表7-1 常用文件管理命令  谈谈您的看法
|