Unix的轻巧“约取而实得”(上篇)
在经过上机操作实践以及掌握Unix系统相关的基础知识之后,可以说已跨进了迈向成功的门槛。接着要登堂入室,继续专进,就必须更加深入的了解Unix 基本命令的功能、使用并掌握一些必备的技巧。这一轮学习会有一定难度,需要强烈的求知欲和进取心作为源动力,因为只有“不满足才是向上的车轮”;同时也需 要注重学习方法,善用前人总结的“约取而实得”的经验,巧学精进,迎难攻解,从而达到再上台阶之成效。
一、文件系统的相关命令
佛教《百喻经》中有一则三重楼的喻里,说有一个财主,见到他的邻居盖房子,三层楼盖得很漂亮,他也要盖这样的三层楼房子。见工匠在做地基,他就说不要地 基,要直接盖第三层楼,因为第三层最高最漂亮。我们都会觉得这个财主很可笑,但在学习知识的过程中,我们可别老想着第三层而忽视打好地基噢!
文件系统相关的命令是操作Unix系统的基础,在《
Unix操作系统的入门与基础
》一文中我们曾使用过其中的部分命令,下面就再来仔细学习这些命令的使用,继续打好今后盖“三层楼”的“地基”吧。
(一)目录管理
我们可以通过使用mkdir、rmdir与cd命令来创建、删除目录以及改变工作目录,并通过ls命令列表显示目录内容,以达到对目录的有效管理。
(1)mkdir命令的功能是创建目录,并且可同时创建多个目录,格式如下:
mkdir [-p] directory-name(s)
参数p代表在建立指定目录时,如果其父目录不存在,则一同创建。
[例]
mkdir dir1 dir2 dir3 //在当前目录下建立目录dir1、dir2、dir3
mkdir dir1/dir4 //在当前目录下的dir1子目录中创建目录dir4
mkdir –p dir6/dir7 //在当前目录下,由于不存在dir6目录,则先自动创建目录dir6,
//然后创建其子目录dir7
(2)rmdir命令的功能是删除目录,但其只能删除空目录(即目录中不包含文件),故此命令一般较少使用,在后文中会介绍一个更为常用的删除目录命令。rmdir命令的格式如下:
rmdir directory-name(s)
(3)在进行处理文件等的操作过程中难免需要在不同的目录下工作,这时cd命令就能派上用场了。cd命令的功能是改变当前的工作目录,它的命令格式如下:
cd [directory-name]
cd后面的目录可以是绝对路径,也可以是相对路径。如果cd后面不跟路径名,则是回到用户的主目录。如果大家对此处的一些概念不甚熟悉的话,请参见《
Unix操作系统的入门与基础
》文中的介绍,此处就不再赘述了。下面来看几个例子:
cd dir1 //进入当前目录中的dir1子目录
cd .. //进入上级目录,即把工作目录改变成当前目录的父目录
cd ../zcl //回到父目录,同时再进入zcl子目录中
(注:上述三个命令的路径都为相对路径)
cd /home/anray //把工作目录改变成根目录中的home目录下的anray子目录
(注:此处路径为绝对路径)
此外,使用pwd 命令可以查看当前的工作目录,它显示的是当前工作目录所处的绝对路径。
(4)ls命令的功能是列表显示指定目录中文件及子目录的信息(其实在Unix系统中目录本身也被视为一个文件,但是为了照顾习惯的思维,在叙述时仍然将其区分为文件与目录两类),缺省输出顺序为纵向按字符顺序排列。它常用的命令格式如下:
ls [-altFR] [directory-name]
参 数a代表显示所有类型的文件,包括文件名以“.”为第一个字符的隐藏文件。参数t代表按文件最后修改时间的顺序依次排列文件,参数R将会列出指定目录下以 及其所有子目录中的文件,使用参数F将会在列表中的每一个目录后面加上“/”,在每个可执行文件后面加上“*”。参数l代表长列表显示目录内容,即列出文 件的类型、访问权限、拥有者、文件大小、修改时间及名称等详细信息。下面将介绍一下长列表显示中的信息的含义,“ls –l”命令的使用如下图所示。
在上图长列表显示文件信息的每一行中,
第一列
|
第1个字符表示文件的类型;
第2-4个字符表示文件所有者对此文件的访问权限;
第5-7个字符表示用户组对此文件的访问权限;
第8-10个字符表示其他用户对此文件的访问权限;
|
第二列
|
文件的链接数
|
第三列
|
文件的所有者
|
第四列
|
文件的用户组名
|
第五列
|
文件所占的字节数
|
第六至八列
|
文件上一次的修改时间
|
第九列
|
文件名
|
注:此表格中的一些概念在下文会有详细介绍,这里只需先了解一下即可
|
(二)文件管理
1、文件的创建、编辑与删除
Unix系统中可以使用touch命令来创建新文件,它的命令格式如下:
touch filename(s)
但要指出,touch命令最常用的功能并不是创建文件,而是改变指定文件(或目录)的最后访问时间和修改时间。它的命令格式如下:
touch [-am] [mmddhhmm[yy]] filename(s)
此 命令中,若指定文件不存在,则创建之;若已存在,则将指定文件的访问时间和修改时间按参数的要求进行改变。参数a代表只改变访问时间,参数m代表只改变修 改时间。参数mmddhhmm[yy]中每隔两位分别表示“月日时分[年]”,用户可利用此参数指定欲设置的时间,若不带此参数,则会自动使用系统当前的 默认时间。
[例] 在当前目录下创建新文件document:
touch document
将刚创建的文件document的访问与修改时间改为2005年10月1日0时0分:
touch -am 1001000005 document
大家可不要小视touch命令的此项作用,在软件的实际开发中,有时它还会与企业的客户关系管理策略或企业经济效益密切关联。倘若你所在企业的开发团队 协作精神好,工作效率高,或者是改进了相关技术与流程,使原与客户合同中约定的项目完成日期大大提前,为了屏蔽用户知情,避免节外生枝,该命令就派上大用 场了。这事我知你知即可,彼此只能心照不宣噢!
文件创建好之后就需要对此文件的内容进行相应的编辑了,在Unix系统中最常使用的编辑工具是vi,在后文中会有专门的章节进行详细介绍,此处先行略过。
在使用Unix系统一段时间之后,大家可能会发现文件数量正在快速增加,而其中的一部分文件可能已经变得过时,或是没有了使用价值,这时就应该及时利用rm命令将此类文件删除了。rm命令的功能是删除文件或目录,它的命令格式如下:
rm [-i] filename(s)
或 rm –r[i] directory-name(s)
使 用参数i的目的是给大家一次“买后悔药”的机会。由于Unix系统中的文件一旦删除将极难恢复,因此在删除文件之前一定要慎重。而参数i的作用是在删除文 件之前进行逐一询问提醒,是否确实要删除此文件。如果输入y则删除文件,若输入其他字符,文件则会被保留。使用了带参数r的rm命令可用来删除一个目录以 及其所有子目录,此时不必受删除目录必须为空目录的条件限制,因此也就更具危险性,大家在使用前应当慎之又慎。
[例]
rm doc1 doc2 doc3 // 直接删除文件doc1、doc2、doc3
rm –i doc1 doc2 doc3 //在删除文件doc1、doc2、doc3时,每删除一个之前先作提示
rm -ri dir1 //删除目录dir1以及其中所含的所有文件与子目录,删除前先作提示
2、文件的查看
常用的查看文本文件的命令有cat、more、head、tail等,下面将逐一进行介绍。
(1)cat命令可以在屏幕上显示出文本文件的内容,它的命令格式如下:
cat filename(s)
不过cat最常见的用法是配合重定向符来清空文件以及将几个文件合并成为一个文件。重定向符的详细用法请参见本文第二章节的内容。
[例]
cat /dev/null > doc.txt //清空文件doc.txt,/dev/null代表空设备文件(记住使用即可)
cat < doc1.txt >> doc2.txt //将doc1.txt中的内容保存在doc2.txt的尾部
(2)使用cat命令查看文本文件时会有一个问题,就是它不会分屏显示文件,这样当文件的内容超出一屏时,除了最后一屏的内容之外,上面的内容都将是一 闪而过。当然解决的办法Unix也替我们想好了,就是使用more命令来查看此类文件。more命令的格式如下:
more filename
more 命令将会以分页的方式显示文本文件内容。当每次将文件内容显示在屏幕上时,如果内容超出一屏,则会在屏幕的左下部显示“ --more--”,并且在其后面显示百分比表示已显示部分占总内容的比例。此后按回车键则会下滚一行,按空格键则会下翻一屏,按“b”字母键可以返回上 一屏,按“h”字母键可以获得关于更多功能的帮助;使用“/”加上字符串可以查找指定字符串的内容信息,找到后可以按“n”字母键继续搜索下一个符合要求 的内容信息,按“q”字母键则可退出并返回Shell命令提示符状态。
(3)head & tail 命令
head与tail命令的格式如下:
head [-n] filename(s)
tail [-n] filename(s)
head命令的功能是显示一个或多个文件开头n行的内容,tail命令的功能是显示一个或多个文件最后n行的内容。若没有指定参数n,则系统会默认显示10行内容。
(三)文件与目录的访问权限
1、文件访问权限简介
在Unix系统中每个文件(或目录)都包含有一套权限,这些权限决定了谁能访问该文件以及如何访问该文件。通常文件有三种权限:
权限
|
普通文件的权限
|
目录的权限
|
r
|
读取文件内容
|
读取文件名称
|
w
|
向文件写入信息
|
建立和删除文件,可以改变文件名等
|
x
|
执行文件
|
使用该目录中的文件
|
在Unix系统中有三种不同的用户类型,分别是所有者(owner)、用户组成员(group)、其他用户(other)。所有者是指文件的创建者;用 户组成员是指由若干个用户组成的组内成员;而除所有者、用户组成员之外的访问者,统称为其他用户。所有者除拥有相关的访问权限外,还有向另两类用户授权之 权限。用户组中的成员在同组内可以共享信息,通常某一类或某一项目中的用户会被Unix系统管理员归为一个用户组,每个用户都被授予能访问同组成员文件的 权限。其他用户在所有者的授权下可对文件有读、写或执行的权限。
上文中我们曾提到使用“ls –l”命令来显示文件的访问权限。如图中所示:
以文件myfile1为例:
|
所有者
|
用户组
|
其他用户
|
权限
|
rw-
|
r--
|
r--
|
含义
|
可读、可写、不可执行
|
可读、不可写、不可执行
|
可读、不可写、不可执行
|
2、文件访问权限的设置
使用chmod命令可以修改文件的访问权限,chmod命令的格式分为两种:
格式1:chmod symbolic_mode file(s)
格式2:chmod absolute_mode file(s)
(1)格式1:符号模式(symbolic_mode)的命令格式如下:
chmod who op permission(s) file(s)
参数who表示用户类型,它的内容为以下一项或多项:
u
|
文件所有者
|
g
|
用户组
|
o
|
其他用户
|
a
|
所有用户
|
参数op表示操作:
+
|
表示要增加permission指定的权限
|
-
|
表示要取消permission指定的权限
|
=
|
设置为permission指定的权限,并取消原设置权限
|
参数permission为权限类型,它的内容为以下一项或多项:
r
|
表示可读
|
w
|
表示可写
|
x
|
表示可执行
|
[例] 以上图为例,要为myfile1的所有者增加执行权限,用户组增加写权限与执行权限,取消其他用户的读权限,使用命令如下:
chmod u+x,g+wx,o-r myfile1 //为不同用户类型设置权限时用“,”分隔
(2)格式2:绝对模式(absolute_mode)的命令格式如下:
chmod xyz file(s)
参数x、y、z分别代表0-7的数字,用来表示所有者、用户组、其他用户对该文件的访问权限。x、y、z所代表的0-7数字的含义如下:
Value
|
permission
|
7
|
r w x
|
6
|
r w -
|
5
|
r – x
|
4
|
r - -
|
3
|
- w x
|
2
|
- w -
|
1
|
- - x
|
0
|
- - -
|
[例] 用绝对模式来完成符号模式中的例子:
chmod 770 myfile1
从对比中大家应该感受到,符号模式会更加直观一些,而绝对模式的数字含义较难记忆,因此设置文件权限时推荐使用符号模式。
(四)文件与目录的移动复制
在Window系统中,我们最熟悉的操作应该莫过于“Ctrl + C”、“Ctrl + V”、“Ctrl + X”了,因为它为我们节省了大量的时间,带来了极大的便利。而在Unix系统中同样为我们准备了cp、mv命令,利用它们可以实现剪刀加糨糊的操作了:)
1、移动或重命名文件(或目录)
利用mv命令可以将一个文件(或目录)从一个目录移到另一个目录中,也可以用于重命名一个文件(或目录)。mv命令的格式如下:
mv [-i] source-file target-file
或 mv [-i] source-directory target-directory
当target-file为文件名时,则相当于文件重命名,target-directory同理。参数i代表在将文件移动到指定目录中时,若已存在同名文件,则将询问是否覆盖已存在的文件,输入y则覆盖,输入其他字符则中止移动,保留原文件。
[例]
mv beans nuts //将文件beans重命名为nuts
mv file1 file2 /tmp //将文件 file1和file2移动到目录/tmp中
mv dir1 /export/home/anray // 将目录dir1包括其所有文件与子目录都移动到目
// 录 /export/home/anray下
// 录 /export/home/anray下
2、复制文件(或目录)
利用cp命令可以将一个文件(或目录)从一个目录复制到另一个目录中,命令格式如下:
cp [-i] source-file(s) destination-directory
或 cp –r[i] source-directory(s) destination-directory
参 数i代表在将文件复制到指定目录中时,若已存在同名文件,则将询问是否覆盖已存在的文件,输入y则覆盖,输入其他字符则中止复制,保留原文件。当复制文件 到指定目录,或许会期望赋予此复制的文件不同于源文件的文件名,则只需将新文件名放在目标目录名之后,用“/”隔开即可。当需要将一个目录连同它的所有子 目录一起复制到目标目录中时,可使用参数r。
[例]
cp beans apple //将文件beans复制到同目录下并改文件名为apple
cp beans apple dir1 //同时复制两个文件beans与apple到当前目录下的子目录dir1中
cp apple dir2/orange //将文件apple复制到当前目录下的子目录dir2中,并改名为orange
cp -r dir1 dir2 //将目录dir1中的所有文件以及其所有子目录复制到目录dir2中
(五)其它常用命令
1、man命令
man命令用于查看帮助信息,常用的命令格式有:
man name
或 man –k keyword
[例]
man //查看man的使用方法
man ls //查看ls命令的帮助信息
在 查看帮助信息过程中,按回车键则会下滚一行,按空格键则会下翻一屏,按“b”字母键可以返回上一屏,使用“/”加上字符串可以查找指定字符串的内容信息, 找到后可以按“n”字母键继续搜索下一个符合要求的内容信息,按“q”字母键则可退出并返回Shell命令提示符状态。
2、clear命令
clear命令的功能是清理屏幕,每次操作Unix系统时间长了,屏幕上的信息难免显得有些凌乱,这时clear一下是不是觉得眼前一下子“清静”了许多:)
3、date命令
date命令的功能是显示系统时间,并可修改系统时间。date命令的格式如下:
date [mmddhhmm[yy]]
date命令后若无参数,则会显示系统当前的默认时间。若要修改系统时间,则输入参数的顺序依次为“月日时分年”。如要将当前系统时间修改为2005年10月1日0时0分,则可使用如下命令:
date命令后若无参数,则会显示系统当前的默认时间。若要修改系统时间,则输入参数的顺序依次为“月日时分年”。如要将当前系统时间修改为2005年10月1日0时0分,则可使用如下命令:
date 1001000005
4、cal命令
cal命令的功能是显示日历。
[例1] 要查看2005年的全年日历:
cal 2005
[例2] 要查看2005年5月份的日历:
cal 5 2005
二、特殊字符的使用
先说一个事例:一次有位朋友问我有没有办法把某英语辅导软件中加密的数据搞到手,我想也没想,立刻翻箱倒柜去找出各种解密工具。大半个小时后,正在我毫 无头绪之际,这位朋友跑来说自己已搞掂了这个软件的使用授权。问他,说只是给软件作者打了个电话。由此想到Unix中的一些特殊字符,往往平时操作中不曾 想到去用它,而是墨守成规地进行自己所熟悉的步骤,实际上是在用那些老笨的方法。如能想到并熟知Unix中特殊字符的功能及使用技巧,就会像我这位聪明的 朋友一样取得事半功倍的效果。
(一)通配符的使用
文件名是命令中最常见的参数,大家可能经常会碰到这样的情况,就是仅知道文件名的一部分,或者是想同时引用多个具有相同扩展名或以相同字符串开头的文 件。Shell中提供了一套被称作通配符的符号,它们能搜索、匹配并产生一个文件名列表,通配符包括“*”、“?”、“[]”。用户执行以包含通配符的文 件名为参数的命令之后,Shell会自动去搜索匹配文件并返回所发现的一个文件名列表,然后Shell就会用这些文件名作为命令的参数了。
星 号“*”用于指代以特定字符串开始或结束的文件名,问号“?”代表文件名称中的单一字符,即“*”可替代文件名中任意长度的字符串,而“?”只能替代一个 字符。方括号“[]” 的作用是使用户确定所需搜索的有效字符集,任何在“[]”里的字符都将被匹配。此外,在“[]”中可使用“-”来指定一个字符集范围,这样就不必手动的一 个个列出来了。
请看下面的例子:
假设当前目录下有8个文件doc1,doc2,doc3,docA,docB,docC,docD,document,分别对其进行如下操作:
ls doc* //显示出doc1,doc2,doc3,docA,docB,docC,docD,document
ls doc? // 显示出doc1,doc2,doc3,docA,docB,docC,docD
ls doc[13AD] // 显示出doc1,doc3,docA,docD
ls doc[A-C] // 显示出docA,docB,docC
ls doc[1-8] // 显示出doc1,doc2,doc3
(二)命令分隔符“;”的使用
有时某些用户可能想在一行中运行多个命令,那么可以在这一行中输入多个命令,命令间用“;”相隔,如:
mkdir tmp; cp file1 tmp/file2; ls -l tmp
Unix会顺序执行以上三条命令,要注意的是在命令间使用分隔符“;”,只代表命令执行的先后顺序。
(三)重定向符的使用
用户欲执行一个命令,当然是要先输入此命令,系统默认的标准输入设备是键盘,而执行命令后的结果通常显示在系统默认的标准输出设备显示器上。但是, Unix系统具有重定向功能,即将标准输出重定向则可将命令的处理结果存入指定的文件,而非显示在屏幕上;将标准输入重定向则可把指定的数据文件作为输入 源,而非从键盘输入数据。
重定向符如下:
<
|
从一个文件或设备重定向输入
|
>
|
重定向输出到一个文件或设备,如文件不存在则创建该文件,如文件已存在则覆盖该文件
|
>>
|
重定向输出到一个文件或设备,并将输出信息追加到已存在文件的尾部
|
例如:
cal 5 2005 > doc1.txt //将2005年5月份的日历保存在文件doc1.txt中
cal 6 2005 >> doc1.txt //将2005年6月份的日历保存在文件doc1.txt尾部
//此时文件doc1.txt中保存了5、6两个月的日历
cat < doc1.txt > doc2.txt //将doc1.txt作为输入源,把其中的内容保存在doc2.txt中
(四)管道符“|”的使用
有时可能会需要将一个命令的标准输出发送给另一个命令使用,而非发送到一个目标文件,这时就需要使用Unix提供的管道符“|”在这两个命令间架起一条连接管道。管道符“|”的作用就是从“|”左边的命令接受输出数据并发送给“|”右边的命令作为输入数据。
如:l
s -l /etc | more
管道符“|”的功能非常强大且很有用,利用它可以实现一些复杂的操作。在下一节关于信息查找命令部分,我们将会看到它的一些应用。
(五)其它特殊字符
美元符“$”是一个特殊操作符,当其置于变量名前面时,变量名会被变量值所代替。因此通常都是通过在变量名前加上“$”来引用该变量的值,“$”也常被称为变量取值符。
Unix中可以使用三种引号符:
(1)单引号(’ ’):功能是让系统原样输出单引号中所含的内容。
(2)双引号(“ ”):双引号中的字符串若含有通配符,则系统会先进行通配后再输出;若含有变量取值符“$”,则系统会先进行变量取值后再输出。
(3)反引号(` `):反引号中所含的内容必须是一个命令,这样它会先执行此命令,然后把命令执行的结果返回输出。
对于上述几个特殊字符,在下文关于Shell脚本编程部分大家会看到具体的应用例子。此外,常见的特殊字符还有“.”代表用户所在的当前目录,“..”代表用户所在的当前目录的父目录,“~”代表用户登陆系统的主目录。