Linux系统与网络管理教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 文件与目录基本操作

Linux系统中,对文件与目录的操作是最基本、最重要的技能。用户可以方便、高效地通过系统提供的命令对文件和目录进行操作,本节将对这些基本命令进行介绍。

2.2.1 显示文件内容命令:cat、more、less、head、tail

用户要查看一个文件的内容时,可以根据显示要求的不同选用以下的命令。

1.cat命令

cat命令的主要功能是用来显示文件,依次读取其后所指文件的内容并将其输出到标准输出设备上。另外,还可以用来连接两个或多个文件,进而生成一个新的文件。

该命令的使用形式为:cat [选项] 文件名。

cat命令中各个选项的含义为

· - v:用一种特殊形式显示控制字符,LFD与TAB除外;

· - T:将TAB显示为“ù I”。该选项需要同- v选项一起使用。即如果没有使用- v选项,则这个选项将被忽略;

· - E:在每行的末尾显示一个$符。与- T选项类似,这个选项也需要同- v选项一起使用;

· - u:输出不经过缓冲区;

· - A:等同于- vET;

· - t:等同于- vT;

· - e:等同于- vE。

下面给出使用该命令的例子:

#cat Readme.txt          //在屏幕上显示Readme.txt文件的内容
//屏幕上显示Readme.txt文件的内容,如果文件中含有特殊字符的话,一起显示出来
#cat - A Readme.txt

//把文件test1和文件test2的内容进行合并,并输出到文件test3之中
#cat test1 test2 > test3
//此时在终端屏幕上不能直接看到命令执行后的输出,也就是文件test3的内容,如果想要看到连
//接后的文件内容,可以使用“cat test3”命令
#cat test3                //显示文件test3的内容

2.more命令

在查看文件的过程中,如果文件的内容过于庞大,文本在屏幕上将会迅速地闪过,用户来不及看清其内容。more命令可以一次显示一屏文本,显示满之后,停下来,并在终端底部打印出- - More- -,系统还将同时显示出已显示文本占全部文本的百分比,如果要继续显示,按Enter键或空格键即可。

该命令的使用形式为:more [选项] 文件名。

more命令中部分常用选项的含义如下:

· - c:作用同- p类似;

· - d:在每屏的底部显示更加友好的提示信息为

- - More- -(XX%)[Press space to contiune , ‘q’ to quit . ];

· - e:在显示最后一个文件的最后一行后自动退出;

· - s:对文件中的连续多个空白行进行压缩,在屏幕上显示为一个空白行。

在more命令的执行过程中,用户可以使用一系列命令动态地根据需要来选择显示的部分。more在显示完一屏内容之后,将停下来等待用户输入某个命令。下表列出一些常用命令,有关这些命令的完整介绍,读者可以在more执行时按h键来查看。这些命令的执行方法是首先输入数字i(行数),再输入所要执行的命令,不然它会以预设值来执行命令。

· v:启动vi编辑器,对文件进行编辑;

· [i]n:在命令行中指定了多个文件名的情况下,指定显示第i个文件,如果i过大(出界),则显示文件名列表中的最后一个文件;

· [i]p:在命令行中指定了多个文件名的情况下,指定显示倒数第i个文件,如果i过大(出界),则显示第一个文件;

· :f:显示当前文件的文件名和行数。

注意

上面三个命令中的n、p和f仅配合命令使用,没有具体的意义,只要依据其规定使用即可。

下面给出示例,说明如何上述参数的使用方法:

//用分页的方式显示文件Makefile的内容
#more Makefile
//下面为文件内容
CC                 = gcc -g
# include path hash should be changed.
INCLUDES         = -I../../include -I/usr/include/pcap -I./include
#INCLUDES        = -I../../include -I/usr/include/pcap -I../../include
CFLAGS            = -Wall -Wstrict-prototypes $(INCLUDES) \
            `libnet-config --defines`
SOURCES           = smtp_ns.c
OBJS              = $(SOURCES:.c=.o)
TARGETS           = smtp_ns
# this is just for test
.PHONY: all clean deps test
all: $(TARGETS)
clean:
      rm -f $(TARGETS) *.o core core.* *~
smtp_ns:        smtp_ns.c
--More--(88%)   //文件显示百分比为88%,说明还有部分内容一整屏难以显示

//显示Rules.make文件的内容,但显示之前先清屏,并且在屏幕的最下方显示完整的百分比
#more - dc example1.c
//下面为文件内容
# This file contains rules which are shared between multiple Makefiles.
# False targets.
.PHONY: dummy
#
# Special variables which should not be exported
#
unexport EXTRA_AFLAGS
unexport EXTRA_CFLAGS
unexport EXTRA_LDFLAGS
unexport EXTRA_ARFLAGS
unexport SUBDIRS
unexport SUB_DIRS
unexport ALL_SUB_DIRS
unexport MOD_SUB_DIRS
unexport O_TARGET
unexport ALL_MOBJS
--More--(4%)[Press space to continue, 'q' to quit.]

//显示COPYING文件的内容,要求每10行显示一次,而且在显示之前先清屏
#more - c -10 COPYING
//显示文件的前10行内容
NOTE! This copyright does *not* cover user programs that use kernel
services by normal system calls - this is merely considered normal use
of the kernel, and does *not* fall under the heading of "derived work".
Also note that the GPL below is copyrighted by the Free Software
Foundation, but the instance of code that it refers to (the Linux
kernel) is copyrighted by me and others who actually wrote it.

Also note that the only valid version of the GPL as far as the kernel
is concerned is _this_ license (ie v2), unless explicitly otherwise
stated.--More--(2%)

3.less命令

less命令的功能和more命令的功能基本相同,也是用来按页显示文件的内容,它们之间的主要差别在于less命令在显示文件内容时既允许用户向前翻阅文件,也允许用户向后翻阅文件;而more命令则只允许用户向后翻阅文件。由于该命令各个参数的使用与more命令类似,在此就不再赘述了。

该命令的使用形式为:less文件名。

如果要按页显示test文件,则执行如下命令:

#less test

如果要向后翻阅,可以使用键盘的“Page UP”键;要向前翻阅文件,则可以使用键盘的“Page Down”键即可。

4.head命令

head命令只显示文件或标准输入(从计算机的标准输入设备中得到的信息流,通常是指从键盘、鼠标等设备获得的数据)的头几行内容。如果用户希望查看一个文件究竟保存的是什么内容,只要查看文件的头几行,而不必浏览整个文件,则可以使用这个命令。

该命令的使用形式为:head [n] 文件名。

该命令用来显示指定文件的前面n行,如果没有给出n值,系统默认值为10行。如果没有指定文件,则head就从标准输入读取。例如:显示文件test.c的前3行。

#head -3 test.c
//前3行的具体内容
#include <stdio.h>
#include <sring.h>
int main()

5.tail命令

tail命令和head命令的功能相对应。如果想要查看文件的尾部,可以使用tail命令。该命令显示一个文件的指定内容。它把文件指定显示范围内的内容显示在标准输出上。同样,如果没有给定文件名,则使用标准输入文件。

该命令的使用形式为:tail [选项] 文件名。

tail命令中各个选项的含义为

· +num:从第num行以后开始显示;

· -num:从距文件尾num行处开始显示。如果省略num参数,系统默认值为10;

· l:以文本行为num的计数单位。与+num或-num选项同时使用时,num表示要显示的文本行行数;

· c:以字节为num的计数单位。与+num或-num选项同时使用时,num表示要显示的字符数。

注意

l、c选项可以省略,系统默认值为l,即以文本行为计数单位。

例如:

#tail -4 example             //显示文件example的最后4行。

2.2.2 文件内容查询命令:grep、egrep、fgrep

文件内容查询命令主要是指grep、fgrep和egrep命令。这组命令以指定的查找模式搜索文件,输出匹配到的字符串,以及包含该字符串的文本行,该文本行的最前面是该行所在的文件名。grep命令一次只能搜索一个指定的模式;egrep命令检索扩展的正则表达式(包括表达式组和可选项);fgrep命令只检索固定字符串,而不识别正则表达式,它是一种更为快速的搜索命令。

这组命令在搜索与定位文件中指定字符串方面非常有效,可以用来检索文件中包含的这些关键词。总的来说,grep命令的搜索功能比fgrep强大,因为grep命令的搜索模式可以是正则表达式,而fgrep则不能。

注意

正则表达式由普通字符(例如a~z、A~Z等)和特殊字符(称为元字符,例如/、*、?等)组成,它是一种用来描述文本模式的特殊语法。简单地说,一个正则表达式就是需要匹配的字符串。

该组命令中的每一个命令都有一组选项,利用这些选项可以改变其输出方式。例如,可以在搜索到的文本行上加入行号,只输出文本行的行号,输出所有与搜索模式不匹配的文本行,或者只是简单地输出已搜索到指定模式的文件名,并且可以指定在查找模式时忽略大小写。

这组命令在指定的文件中查找与模式匹配的行。如果没有指定文件,则从标准输入中读取。正常情况下,每个匹配的行都被显示到标准输出。如果要查找的文件是多个,则在每一行输出之前加上文件名。

该组命令的使用方式如下:

grep [选项] [查找模式] [文件名1,文件名2,…]
egrep [选项] [查找模式] [文件名1,文件名2,…]
fgrep [选项] [查找模式] [文件名1,文件名2,…]

下面列出常用的部分命令选项:

· - b:在输出的每一行前显示包含匹配字符串的行在文件中的字节偏移量;

· - c:只显示匹配行的数量;

· - i:检索时忽略大小写;

· - h:在查找多个文件时,指示grep不要将文件名加入到输出之前;

· - l:显示首次匹配串所在的文件名并用换行符将其隔开。当在同一个文件中多次出现匹配串时,不重复显示其文件名;

· - n:在输出前加上匹配串所在行的行号(文件首行行号为1);

· - v:只显示不包含匹配串的行;

· - x::只显示整行严格匹配的行。

下面给出一些grep命令的例子:

#grep ‘text file’stdc.h     //在文件stdc.h中搜索字符串“text file”
#grep data *                  //搜索出当前目录下所有文件中含有“data”字符串的行
#grep stdio.h *.c            //在C程序文件中搜索包含有“stdio.h”头文件的所有文件

fgrep命令和egrep命令与的使用方法同grep命令类似,这里就不举例说明了。

2.2.3 文件查找命令:find、locate

如果用户需要对文件进行查找时,可以使用下面介绍的几种命令。

1.find命令

find命令的功能是从指定的目录开始,递归地搜索各个子目录,查找满足寻找条件的文件并对其采取相关的操作。find命令提供了多种查找条件,功能非常强大。

该命令的使用形式为:find [选项] 文件名。

find命令提供的查找条件可以为单一条件,也可以为由逻辑运算符(and、or和not)构成的复合条件。逻辑运算符and、or和not的含义分别为

· and:逻辑与,在命令中用“-a”表示,该运算符是系统的默认选项,表示只有当所给的条件全部都满足时,查找条件才能满足;

· or:逻辑或,在命令中用“-o”表示。该运算符表示只要所给的条件中有一个满足时,查找条件就能够满足;

· not:逻辑非,在命令中用“!”表示。该运算符表示查找不满足所给条件的文件。

该命令的查找方式主要为以名称和文件属性查找,参数如下所示。

· - name‘字串’:查找文件名匹配所给字串的所有文件,字串中可以使用*、?、[ ]等通配符。

· - lname‘字串’:查找文件名匹配所给字串的所有符号链接文件,字串中可以使用*、?、[ ]等通配符。

· -gid n:查找属于ID号为n的用户组的所有文件。

· -uid n:查找属于ID号为n的用户的所有文件。

· -group‘字串’:查找属于用户组名为所给字串的所有的文件。

· -user‘字串’:查找属于用户名为所给字串的所有的文件。

· -empty:查找大小为0的目录或文件。

· -path‘字串’:查找路径名匹配所给字串的所有文件,字串中可以使用*、?、[ ]等通配符。

· -perm权限:查找具有指定访问权限的文件和目录,权限可以使用一个3位数来表示,例如711表示文件/目录所有者具有读写、执行权限,同组用户和系统其他用户只具有执行权限,644表示文件/目录所有者具有读/写权限,同组用户和系统其他用户之具有读权限,具体如何设置数字权限形式,读者请参看本章后面对文件/目录访问权限管理的介绍。

· -size n[bckw]:查找指定文件大小的文件,n后面的字符表示单位,系统的默认值为b,表示大小为512B的块。

find命令也提供了一些对查找出来的文件进行特定操作的选项。

· - exec命令名称{}:对符合条件的文件执行所给的Linux命令,而不询问用户是否要执行该命令。{}表示命令的参数即为所找到的文件;命令的末尾必须以“\;”结束。

· - ok命令名称{}:对符合条件的文件执行所给的Linux命令,与exec不同的是,它会询问用户是否要执行该命令。

· - ls:详细列出查找到的所有文件。

· - fprintf文件名:将查找到的文件名写入到指定文件中。

· - print:在标准输出设备上显示查找到的文件名。

注意

通配符*表示一个字符串;?只代表一个字符。它们只能通配文件名或扩展名,而不能全都表示。

下面给出使用该命令的例子:

//查找当前目录中所有以main开头的文件,并显示这些文件的内容
#find . - name ‘main*’ - exec more {} \;

//删除当前目录下所有一周之内没有被访问过的a.out或*.o文件
#find . \(- name a.out - o - name ‘*.o’\)\
> - atime +7- exec rm {} \;

//寻找3个给定条件都满足的所有文件
#find –name ’tmp’ –xtype c -user ’inin’

//查询文件名为‘tmp’或是匹配‘mina*’的所有文件
#find –name ’tmp’ –o –name ’mina*’

//命令查询文件名不是‘tmp’的所有文件
#find ! –name ’tmp’

2.locate命令

locate命令的功能也是用来查找文件,它比find命令的搜索速度快。使用该命令时需要一个数据库,这个数据库由每天的例行工作(crontab)程序来建立。建立好数据库之后,就可以方便地用来搜寻所需文件了。

该命令的使用形式为:locate [选项] 文件名。

注意

crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。用户把要执行的命令序列放到crontab文件中进行执行,每个用户都可以拥有自己的crontab文件。

例如,在/usr/src/linux-2.4目录下查找包含字符串“stdio.h”的所有文件:

#locate /usr/src/linux-2.4
//部分查询所得的文件
/usr/lib/perl5/5.6.0/i386-linux/CORE/nostdio.h
/usr/lib/bcc/include/stdio.h
/usr/include/isc/stdio.h
/usr/include/bits/stdio.h
/usr/include/stdio.h
/usr/src/linux-2.5.22/arch/ppc/boot/include/nonstdio.h
/usr/src/linux-2.5.22/arch/ppc/xmon/nonstdio.h

2.2.4 文本处理命令:sort、uniq

文件处理命令包括sort和uniq,下面分别对其进行介绍。

1.sort命令

sort命令的功能是对文件中的各行进行排序,它最初是用来对数据库格式的文件内容进行各种排序操作的。实际上,sort命令可以被认为是一个非常强大的数据管理工具,用来管理内容类似数据库记录的文件。

该命令将逐行地对文件中的内容进行排序,如果两行的首字符相同,则继续比较这两行的下一字符。sort排序是根据从输入行抽取的一个或多个关键字进行比较来完成的。排序关键字定义了用来排序的最小的字符序列。在默认情况下,以整行为关键字按ASCII字符顺序进行排序。

该命令的使用形式为:sort [选项] 文件名。

该命令的主要选项包括:

· - m:如果给定的文件已经排好序,则对文件进行合并;

· - c:检查给定文件是否已排好序,如果它们没有全部排好序,则输出一个出错信息,并返回状态值1;

· - u:对排序后内容相同的行进行合并,只保留其中的一行;

· - o:将排序的结果输出到文件,而非标准输出,如果输出文件是输入文件之一,则将该文件的内容写入到一个临时文件中,然后再进行排序和输出结果。

该命令改变默认排序规则的选项主要包括:

· - d:按字典顺序排序,比较时仅字母、数字、空格和制表符有意义;

· - f:不区分大小写字母;

· - I:忽略非打印字符;

· - M:作为月份比较:“JAN”<“FEB”< … <“DEC”;

· - r:按逆序输出排序结果;

· +posl -pos2:指定一个或几个字段作为排序的关键字,字段位置从posl开始,到pos2为止(包括posl,不包括pos2)。如不指定pos2,则从posl到行尾。字段和字符的位置从0开始;

· - b:在每行中寻找排序关键字时忽略前导的空格和制表符;

· - t separator:指定字符separator作为字段分隔符。

下面给出几个例子进行说明:

//用sort命令对text文件中各行进行排序,并输出排序结果
#cat text        //查看排序前文件的内容
//text原文件内容
vegetable soup
fresh vegetables
fresh fruit
lowfat milk

#sort text       //对文件进行排序
//显示排序后结果
fresh fruit
fresh vegetables
lowfat milk
vegetable soup

//用户可以保存排序后的文件内容,也可以将排序后的文件内容输出至打印机。下例中用户把排序后
//文件的内容保存到名为result的文件之中
#sort text>result

//以第2个字段作为排序关键字对文件example的内容进行排序
#sort +1-2 example

//对于file1和file2文件内容反向排序,结果放在outfile中,利用第2个字段的第一个字符
//作为排序关键字

#sort -r -o outfile +1.0-1.1 example
//sort排序常用于在管道中与其他命令连用,组合完成比较复杂的功能,如利用管道将
//当前工作目录中的文件送给sort进行排序,排序关键字是第6个至第8个字段
#ls - l | sort +5 – 7

注意

字段编号从0开始计算。

除了对文件内容进行排序之外,sort命令也可以对标准输入进行类似的操作。例如,如果想要将几个文件进行合并,并对合并后的文本行进行排序,可以首先用命令cat将多个文件合并,然后用管道操作把合并后的文本行输入给命令sort,sort命令将对这些文本行进行排序、合并并输出。在下面的例子中,文件veglist与文件fruitlist的文本行经过合并与排序后被保存到文件clist中。

#cat veglist fruitlist | sort > clist

2.uniq命令

文件经过处理之后在它的输出文件中可能会出现重复的行。例如,用cat命令将两个文件合并后,再使用sort命令进行排序,就可能出现重复行。这时可以使用uniq命令将这些重复行从输出文件中删除,只留下其中的一行。

注意

uniq命令首先读取输入文件,对文件内容进行行比较。在正常情况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令的输出结果可以写入到输出文件之中。输入文件和输出文件不能相同。如果输入文件用“-”表示,则从标准输入读取。

该命令的使用形式为:uniq [选项] 文件名。

该命令主要的选项包括:

· - d:只显示重复的行。

· - u:只显示不重复的行。

· - c:显示输出中,在每行行首加上本行在文件中出现的次数。它可取代-u和-d选项。

· - n:前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。

· + n:前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。

· - f n:与-n相同,这里n是字段数。

· - s n:与+n相同,这里n是字符数。

下面给出使用该命令的实例:

#uniq -u example         //显示文件example中不重复的行
//显示文件example中不重复的行,从第2个字段的第2个字符开始进行比较
#uniq - u -1 +1 example

2.2.5 文件内容统计命令:wc

文件内容统计命令主要是指wc命令。该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。如果有多个输入文件,wc会给出每个文件的统计结果以及所有文件的统计数目。这里的字是由空格字符区分开的最大字符串。

该命令的使用形式为:wc [选项] 文件名。

该命令主要的选项包括:

· - c:统计字节数。

· - l:统计行数。

· - w:统计字数。

下面给出使用该命令的实例:

//统计文件README的行数、字节数和字数
#wc -lcw README
    303    2265   14242 README

//统计文件README和README.freeswan的行数、字节数和字数
#wc -lcw README README.freeswan
    303    2265   14242 README
    174     766    5585 README.freeswan
    477    3031   19827 total

说明

上面的选项顺序可以随意调换,而统计的结果形式相同。

2.2.6 文件比较命令:comm、diff

Linux系统中可以使用comm命令和diff命令对文件的内容进行比较,下面分别对这两个命令进行介绍。

1.comm命令

命令用来对两个已经排好序的文件进行比较。其中file1和file2是已排序的文件(如果没有,可以使用上面介绍的sort命令进行排序)。Comm命令首先读取这两个文件,然后生成3列输出,它们分别是:仅在file1中出现的行、仅在file2中出现的行以及在两个文件中都存在的行。如果文件名用“-”,则表示从标准输入读取。

该命令的使用形式为:comm [选项] 文件名。

其中,选项1、2或3控制相应的列显示与否。例如:

comm -12        //只显示在两个文件中都存在的行
comm -23        //只显示在第一个文件中出现,而没有在第二个文件中出现的行
comm -123       //什么也不显示

下面给出使用该命令的例子:

//对文件app.c和app1.c进行比较
#cat app.c
//待比较文件app.c内容
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
int count = 0;
printf("hello,world!\n");
}

//显示待比较文件app1.c内容
#cat app1.c
#include <stdio.h>
#include <string.h>
void main()
{
int count ;
char *s = "hello,world";
printf("hello,world!\n");
}

//对上述文件进行比较,显示两个文件中共有行的内容
#comm -12 app.c app1.c
#include <stdio.h>
#include <string.h>
void main()
{
printf("hello,world!\n");
}

//对上述文件进行比较,显示在第一个文件中出现,而不在第二个文件中出现的内容
#comm -23 app.c app1.c
#include <stdlib.h>
int count = 0;

2.diff命令

diff命令的功能是逐行比较两个文本文件,列出其不同之处。它对给出的文件进行系统地检查,显示出两个文件中所有不同的行,而不要求事先对输入文件进行排序。

该命令的使用形式为:diff [选项] file1 file2。

该命令运行后的输出格式如下所示:

n1 a n3, n4

n1, n2 d n3

n1, n2 c n3, n4

以上信息说明了将文件file1更改为文件file2的方法,从而给出了两个文本文件之间的差异。其中,字母(a、d和c)之前的行号(n1,n2)是针对file1的,其后面的行号(n3,n4)则是针对file2的。a、d和c分别表示附加、删除和修改操作。

上面输出结果的每一行后面跟随受到影响的若干行,其中以“<”打头的行属于file1,以“>”打头的行属于file2。

说明

diff命令能够自动区分文件的类型,不会将普通文件与FIFO(管道文件)、块设备文件,以及字符设备文件等进行比较。

如果file1和file2都是目录,则diff会产生很多信息。如果一个目录中只有一个文件,则产生一条信息,指出该目录路径名和其中的文件名。

diff命令主要的选项包括:

· - b:忽略行尾的空格,而字符串中的一个或多个空格符都视为相等;

· - c:采用上下文输出格式(提供3行上下文);

· - C n:采用上下文输出格式(提供n行上下文);

· - e:产生一个合法的ed脚本作为输出;

· - r:当file1和file2是目录时,递归作用到各文件和目录上。

下面给出使用该命令的实例:

//对文件app.c和app1.c进行比较
#cat app.c
//待比较文件app.c内容
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
int count = 0;
printf("hello,world!\n");
}

//显示待比较文件app1.c内容
#cat app1.c
#include <stdio.h>
#include <string.h>
void main()
{
int count ;
char *s = "hello,world";
printf("hello,world!\n");
}

//使用diff比较得出上述两个文件的不同之处
#diff app.c app1.c
3d2
< #include <stdlib.h>
6c5,6
< int count = 0;
---
> int count ;
> char *s = "hello,world";

上述结果表示把文件app.c的第3行“#include <stdlib.h>”删除,并修改app.c文件的第5行“int count = 0;”和app1.c文件的第5行“int count ;”、第6行“char *s = "hello,world";”后,则两个文件相同。

2.2.7 文件的复制、移动和删除命令:cp、mv、rm

文件的复制、移动和删除操作在Linux系统中使用得非常频繁,下面对这些操作的命令进行详细介绍。

1.cp命令

cp命令的功能是将给出的文件或目录复制到另一文件或目录中,就如同DOS下的copy命令一样,功能非常强大。

该命令的使用形式为:cp [选项] 源文件或目录 目标文件或目录。

该命令的各选项含义如下。

· - a:通常在复制目录时使用,以便保留链接、文件属性,并递归地复制目录。

· - d:复制时保留链接。

· - f:删除已经存在的目标文件而不提示。

· - i:交互式复制,和f选项相反,在覆盖目标文件之前将给出询问用户进行确认,用户如果输入y,则目标文件将被覆盖。

· - p:除了复制源文件的内容之外,还将文件的修改时间、访问权限等属性也复制到新文件中。

· - r:如果给出的源文件是一个目录文件,则递归复制该目录下所有的子目录和文件,此时目标文件必须为一个目录名。

· - l:只创建一个链接,不复制文件。

注意

在使用cp命令复制文件时,如用户指定的目标文件名是一个已存在的文件名,则这个文件就会被新复制的源文件覆盖,因此,为了防止用户在不经意的情况下破坏另一个文件,建议使用i选项。

下面举例说明cp命令的使用:

//将文件exam1.c拷贝到/usr/wang目录下,并改名为shiyan1.c
#cp - i exam1.c /usr/wang/shiyan1.c

//如果不希望重新命名,可以使用下面的命令
#cp exam1.c /usr/ wang/

//将/usr/xu目录中的所有文件及其子目录复制到目录/usr/liu中
#cp - r /usr/xu/ /usr/liu/

2.mv命令

mv命令用来为文件或目录改名或将文件由一个目录移到另一个目录之中,它类似于DOS下的ren和move的组合。

该命令的使用形式为:mv [选项] 源文件或目录 目标文件或目录

说明

根据mv命令中第二个参数类型的不同(文件或目录),mv命令对文件进行重命名或者将其移至一个新的目录之中。当第二个参数类型是文件时,mv命令完成文件重命名;此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时,mv先复制,再将原有文件删除,而该文件相关的链接也将丢失。

命令中各选项的含义为

· - i:进行交互式操作。如果进行文件重命名或移动时目标文件已经存在,则询问用户是否覆盖已有文件,用户通过输入y或n来决定下一步动作,进而避免误操作;

· - f:不进行交互式操作。如果进行文件重命名或移动时目标文件已经存在,则覆盖已有文件而不给出任何指示,指定此选项后,i选项将不再起作用。

说明

为了防止用户在不经意的情况下破坏另一个文件,用户使用mv命令重命名或移动文件时,建议使用i选项。

下面举例说明该命令的使用:

//将/usr/xu中的所有文件移到当前目录(用“.”表示)中
#mv /usr/xu/ * .

//将文件wch.txt重命名为wjz.doc
#mv wch.txt wjz.doc

3.rm命令

rm命令的功能是删除一个或多个文件,它也可以将某个目录及其下的所有文件及子目录全部删除。对于链接文件,则只是删除了链接,而原有文件均保持不变。

该命令的使用形式为:rm [选项] 文件。

该命令的各选项含义如下:

· - f:忽略不存在的文件,不给出提示信息;

· - r:将给出的全部目录和子目录递归地删除,如果没有使用该选项,则rm命令不会删除目录;

· - i:进行交互式删除。

注意

使用rm命令要格外小心。因为文件或目录一旦被删除,将无法恢复。为了防止这种情况的发生,可以使用rm命令中的i选项来进行交互式删除操作,确认要删除的每一个文件。如果用户输入y,文件或目录将会被删除;否则文件将会被保留。

下面给出一个例子,删除文件test和example,同时要求在删除前对每个文件进行确认。

#rm –i test example
Remove test ?n
Remove example ?y

在上面的例子中,用户最终决定删除example文件,而保留了test文件。

2.2.8 文件链接命令:ln

文件链接命令是指ln命令。该命令在文件之间创建链接。这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称。对于这个新的文件名,可以为其指定不同的访问权限,以控制对用户文件的操作。

如果链接指向目录,用户就可以利用该链接直接进入被链接的目录而不用使用较长的路径名。而且,即使用户删除这个链接,也不会破坏原来的目录。

链接有两种,一种称为硬链接(Hard Link);另一种称为符号链接(Symbolic Link),也称为软链接。建立硬链接时,链接文件和被链接文件必须位于同一个文件系统中,并且不能建立指向目录的硬链接。而对符号链接,则不存在这个问题。在默认情况下,ln命令将产生硬链接。

该命令的使用形式为:ln [选项] 目标 [链接名]。

在硬链接的情况下,参数中的“目标”将会被链接至给定的“链接名”。如果“链接名”是一个目录名,则系统会在该目录之下建立一个或多个与“目标”同名的链接文件,链接文件和被链接文件的内容完全相同。如果“链接名”为一个文件,系统会提示该文件已存在,不能进行链接。如果指定了多个“目标”参数,则最后一个参数必须为目录。

如果给ln命令加上- s选项,则建立符号链接。“链接名”可以是任何一个文件名(可包含路径),也可以是一个目录,并且允许其与“目标“不在同一个文件系统中。如果“链接名”是一个已经存在的目录,系统将在该目录下建立一个或多个与“目标“同名的文件,这些新建的文件实际上是指向原“目标”的符号链接文件。如果“链接名”为一个已经存在的文件,则系统不创建链接。

注意

使用文件链接的方法与使用普通文件的方法完全相同,所以这里不再重复介绍。

下面举例说明该命令的使用:

//用户为当前目录下的文件lunch创建了一个符号链接/home/xu
#ln - s lunch /home/xu

//使用建立的软链接查看文件,实际查看的是原文件lunch的内容
#cat /home/xu

2.2.9 目录的创建与删除命令:mkdir、rmdir

下面介绍Linux系统中目录的创建以及删除命令的使用。

1.mkdir命令

mkdir命令的功能是创建一个或多个新的目录。

该命令的使用形式为:mkdir [选项] 目录名

要求创建目录的用户在当前目录中应该具有写权限,并且给定的目录名不能是当前目录中已有的目录或文件名称。

命令中各选项的含义为

· - m:对新建目录设置存取权限,也可以使用后面将会介绍的chmod命令来进行设置;

· - p:可以是一个路径名称。此时若路径中的某一级目录尚不存在,使用该选项后,系统将会自动建立这些目录,即一次性建立多级目录。

下面举例说明该命令的使用:

//在当前目录中建立inin和inin下的/mail目录,即连续建两级目录
#mkdir - p - m 700 ./inin/mail/

该命令的执行结果是在当前目录中创建嵌套的目录层次inin /mail,权限设置为只有文件所有者有读、写和执行权限。

2.rmdir命令

前面介绍的rm命令可以用来删除目录,事实上,Linux系统还提供一个专门用来对目录进行删除操作的命令。

该命令的使用形式为:rmdir [选项] 目录名

一个目录在被删除之前必须为空,即其中不包含文件或子目录。删除某目录时也必须具有对父目录的写权限。

注意

rm - r dir命令可代替rmdir,但是有很大的危险性。

命令中各选项的含义为

· - p:递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。如果整个路径被删除或者由于某种原因保留部分路径,则系统在标准输出上显示相应的信息。

下面举例说明该命令的使用:

//要将/usr/xu/txt目录删除
#rmdir - p /usr/xu/txt

2.2.10 改变工作目录、显示路径以及显示目录内容命令:cd、pwd、ls

Linux系统下,可以使用cd、pwd和ls命令来改变工作目录、显示路径以及显示目录的内容,下面对这些命令进行介绍。

1.cd命令

cd命令用来对当前目录进行切换。

该命令的使用形式为:cd [目录名]。

若没有指定目标目录,则回到用户的主目录。为了改变到指定目录,用户必须拥有对指定目录的执行和读权限。另外,在cd命令中也可以使用通配符。

假设用户当前目录是:/home/working,若要更换到/usr/src目录中,则使用如下命令:

#cd /usr/src

2.pwd命令

在Linux层次目录结构中,用户可以在被授权的任意目录下使用mkdir命令创建新的目录,也可以使用cd命令从一个目录切换到另一个目录。然而,没有提示符来告知用户目前处于哪一个目录中。要想知道当前所处的目录,可以用pwd命令,该命令将显示整个路径名。

该命令的使用形式为:pwd。

注意

此命令显示当前工作目录的绝对路径,而不是相对路径。

例如使用该命令显示当前工作路径,命令如下:

#pwd
/home/yanyb

3.ls命令

ls是英文单词list的简写,其功能是列出目录的内容,即目录下的文件和子目录,类似于DOS下的dir命令(Linux系统中也提供了该命令)。ls命令是用户最常用的命令之一,因为用户要不时地查看某个目录的内容。

该命令的使用形式为:ls [选项] [目录或是文件]。

对于每个目录,该命令将列出其中所有的文件和子目录。对于每个文件,ls将输出其文件名及所要求的其他信息。默认情况下,输出条目按字母顺序排序。如果未给出目录名或文件名,则显示当前目录的信息。

命令中部分常用选项的含义如下。

· - a:显示指定目录下所有的文件和子目录,包括隐藏文件。

· - A:显示指定目录下所有的文件和子目录,包括隐藏文件。但不列出“.”和“..”。

· - d:如果参数是目录,则只显示其名称而不显示其下的各个文件和子目录,该选项一般与l选项一起使用,以得到目录的详细信息。

· - l:以长格式来显示文件的详细信息。这个选项非常常用,每行列出的信息依次是

➣ 文件类型与权限、链接数、文件属主、文件属组、文件大小、创建或最近修改的时间、文件名称

➣ 对于符号链接文件,显示的文件名之后会有“—>”和所链接文件路径名。

➣ 对于设备文件,其“文件大小”字段显示的是主、次设备号,而不是文件的大小。目录中的总块数显示在长格式列表的开头,其中包含间接块。

· - L:若指定的名称为一个符号链接文件,则显示链接所指向的文件。

· - m:按字符流格式输出,文件跨页显示,以逗号分开。

· - n:与l选项类似,不同之处在于输出信息中的文件属主和属组使用相应的UID号和GID号来表示,而不是实际的名称。

· - R:递归地显示指定目录的各个子目录中的文件。

用ls - l命令显示的信息中,开头是由10个字符构成的字符串,其中第一个字符表示文件类型,它可以是下述类型之一。

· -:普通文件

· d:目录

· l:符号链接

· b:块设备文件

· c:字符设备文件

后面的9个字符表示文件的访问权限,分为3组,每组3位。第一组表示文件属主的权限,第二组表示同组用户的权限,第三组表示其他用户的权限。每一组的三个字符分别表示对文件的读、写和执行权限。

各权限如下所示。

· r:读。

· w:写。

· x:执行,对于目录,表示进入权限。

· s:当文件被执行时,把该文件的UID或GID赋予执行进程的UID(用户ID)或GID(组ID)。

· t:设置标志位(留在内存,不被换出)。如果该文件是目录,在该目录中的文件只能被超级用户、目录拥有者以及文件属主删除。如果是可执行文件,在该文件执行后,指向其正文段的指针仍留在内存。这样再次执行它时,系统就能更快地装入该文件。

· -:没有设置权限。

下面给出使用该命令的例子:

//列出当前目录的内容
#ls -A
devCommon.cpp   devInt.cpp       devUInt.cpp           Makefile
devCommon.h      devShort.cpp    devUShort.cpp
devDouble.cpp   devStat.cpp      dsetTypes.h

//列出某个目录的内容
#ls –A /home/yanyb
.bash_history   .bash_profile   example.c   .viminfo
.bash_logout    .bashrc           tmp           .zshrc

//用长格式列出某个目录下所有的文件(包括隐藏文件)
#1s -la /home/yanyb
total 1248
total 44
drwx------3 yanyb yanyb 40962010-05-27 04:29 .
drwxr-xr-x 6 root   root  40962010-05-28 19:39 ..
-rw-------1 yanyb yanyb   472010-05-07 03:53 .bash_history
-rw-r--r--1 yanyb yanyb   332010-05-27 20:02 .bash_logout
-rw-r--r--1 yanyb yanyb  1762010-05-27 20:02 .bash_profile
-rw-r--r--1 yanyb yanyb  1242010-05-27 20:02 .bashrc
-rw-rw-r--1 yanyb yanyb   652010-05-30 04:29 example.c
drwxrwxr-x 2 yanyb yanyb 40962010-05-30 04:29 tmp
-rw-------1 yanyb yanyb  6272010-05-30 04:29 .viminfo
-rw-r--r--1 yanyb yanyb  6582010-05-27 20:02 .zshrc

//用长格式列出某个目录下所有的文件包括隐藏文件和它们的i节点号。并把文件属主和属组以UID
//号和GID号的形式显示
#1s -1ain /home/yanyb
total 44
7014443 drwx------3500 50040962010-05-27 04:29 .
7012353 drwxr-xr-x 6   0    0  40962010-05-28 19:39 ..
7013763-rw-------1500 500   472010-05-07 03:53 .bash_history
7014447-rw-r--r--1500 500   332010-05-27 20:02 .bash_logout
7014446-rw-r--r--1500 500  1762010-05-27 20:02 .bash_profile
7014444-rw-r--r--1500 500  1242010-05-27 20:02 .bashrc
7015002-rw-rw-r--1500 500   652010-05-30 04:29 example.c
7178344 drwxrwxr-x 2500 50040962010-05-30 04:29 tmp
7015094-rw-------1500 500  6272010-05-30 04:29 .viminfo
7014445-rw-r--r--1500 500  6582010-05-27 20:02 .zshrc