首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

Linux 资料和目录管理常用命令(2)

2013-08-10 
Linux 文件和目录管理常用命令(2)6.11.11? chown命令:改变文件或目录的拥有者chown命令用于改变文件或目录

Linux 文件和目录管理常用命令(2)

6.11.11? chown命令:改变文件或目录的拥有者

chown命令用于改变文件或目录的拥有者,chown命令格式为:

  1. chown?[选项]?用户名?文件或目录?

其中可用选项意义如下。

-R:可以一次修改某个目录下所有文件的所有者。

其中用户名为新拥有者的用户标识符。例如将文件data的属主改为teacher:

  1. #?chown??teacher??data??

如将/root/file1.doc文件复制到用户teacher1的主目录/home/teacher1中,复制之后可以发现此文件的拥有者仍然是root,命令行为:

  1. #?ls??-l??file1.doc ?
  2. -rw-rw-r--?1?root?root?18?07-27?16:21?file1.doc ?
  3. #?cp??file1.doc??/home/teacher1 ?
  4. #?ls??-l??/home/teacher1/file1.doc? ?
  5. -rw-rw-r--?1?root?root?18?07-27?16:22?/home/teacher1/file1.doc?

为此,使用chown将file1.doc文件的所有权赋予teacher1,命令行为:

  1. #?chown??teacher1??/home/teacher1/file1.doc ?
  2. #?ls??-l??/home/teacher1/file1.doc? ?
  3. -rw-rw-r--?1?teacher1?root?18?07-27?16:22?/home/teacher1/file1.doc?

可以看到file1.doc文件的所有者已改为teacher1,但用户组仍为root。也可以使用chown命令修改文件所属的用户组,命令格式为:

  1. chown??用户名:用户组?文件或目录?

要在上例中一并更改file1.doc文件的属主和用户组为teacher1,命令行为:

  1. #?chown??teacher1:teacher1???/home/teacher1/file1.doc ?
  2. #?ls??-l??/home/teacher1/file1.doc? ?
  3. -rw-rw-r--?1?teacher1?teacher1?18?07-27?16:22?/home/teacher1/file1.doc ?

?

6.11.12? chgrp命令:修改文件或目录所属的用户组

chgrp允许用户修改文件或目录所属的用户组,但该用户必须是根用户或同时属于被设置的新的用户组,否则无法修改成功。chgrp命令格式为:

  1. chgrp?[选项]?用户组名??文件或目录?

可用选项意义如下。

-R:可以一次修改某个目录下所有文件所属的用户组。

其中用户组名可以是用户组名称或用户组的GID。

例如将文件data的组别改为staff。

  1. #?chgrp??staff??data?

?

6.11.13? cat 命令:把一个文件发送到标准输出设备

cat是Concatenate的缩写,用于把一个文件发送到标准输出设备,与DOS或Windows下的type命令相似。cat命令可以对任意一个文件使用,屏幕将一次显示文件的所有内容,中间不停顿,不分屏。除了显示文件内容外,cat还具有由键盘读取数据和将多个文件合并的功能。其命令格式为:

  1. cat?[选项]?[文件]…?

各选项及其说明如表6.22所示。

表6.22? cat选项及其说明

选????项

说????明

-A,--show-all

等价于-vET

-b,--number-nonblank

对非空行输出行编号

-e

等价于-vE

-E,--show-ends

在每行结束处显示$

-n,--number

对输出的所有行编号

-S,--squeeze-blank

不输出多行空行

-t

与-vT等价

-T,--show-tabs

将跳格字符TAB显示为^I

-v,--show-nonprinting

使用^和M-符号显示非打印字符,

但LFD和TAB除外

--help

显示帮助信息并离开


例如显示hello.c文件内容的命令如下所示:

  1. #?cat??hello.c ?
  2. hello?world!?

该命令可配合重定向符">"建立小型文本。例如将键盘输入的内容输出并重定向到文件example1中,按Ctrl+d(或Ctrl+c)组合键存盘退出,命令行为:

  1. #?cat??>?example1 ?
  2. aa?bb?cc?dd ?
  3. bb?cc?dd?ee ?
  4. cc?dd?ee?ff ?
  5. #?cat??example1 ?
  6. aa?bb?cc?dd ?
  7. bb?cc?dd?ee ?
  8. cc?dd?ee?ff?

cat命令可以联合输出多个文件的内容,例如:

  1. #?cat??example1 ?
  2. aa?bb?cc?dd ?
  3. bb?cc?dd?ee ?
  4. cc?dd?ee?ff ?
  5. #?cat??example2 ?
  6. dd?ee?ff?gg ?
  7. ee?ff?gg?hh ?
  8. ff?gg?hh?ii ?
  9. #?cat??example1??example2 ?
  10. aa?bb?cc?dd ?
  11. bb?cc?dd?ee ?
  12. cc?dd?ee?ff ?
  13. dd?ee?ff?gg ?
  14. ee?ff?gg?hh ?
  15. ff?gg?hh?ii?

如果要将上例中的example1和example2合并后放入新文件example3中,命令行为:

  1. #?cat??example1??example2??>??example3????//合并后输出到example3文件 ?
  2. #?cat??example3 ?
  3. aa?bb?cc?dd ?
  4. bb?cc?dd?ee ?
  5. cc?dd?ee?ff ?
  6. dd?ee?ff?gg ?
  7. ee?ff?gg?hh ?
  8. ff?gg?hh?ii?

如果要在显示输出的每一行前自动添加行号(空白行除外),可使用选项"-b",命令行为:

  1. #?cat??-b??example3 ?
  2. ?????1??aa?bb?cc?dd ?
  3. ?????2??bb?cc?dd?ee ?
  4. ?????3??cc?dd?ee?ff ?
  5. ?????4??dd?ee?ff?gg ?
  6. ?????5??ee?ff?gg?hh ?
  7. ?????6??ff?gg?hh?ii?

注意:使用选项"-n"会给所有行加上行号,即使空行也不例外。

?

6.11.14? more 命令:一次显示一屏信息

more命令一次显示一屏信息,若信息未显示完屏幕底部将出现"-More-(xx%) "。此时按Space键,可显示下一屏内容;按Enter键,显示下一行内容;按B键,显示上一屏;按Q键可退出more命令。more命令格式为:

  1. more?[选项]?文件名?

常用的more选项如表6.23所示。

表6.23? 常用的more选项

参????数

说????明

+n

从笫n行开始显示

-n

定义屏幕大小为n


续表

参????数

说????明

+/pattern

从pattern前两行开始显示

-c

从顶部清屏,然后显示

-d

提示“Press space to continue,’q’ to quit

(按空格键继续,按q键退出)”,禁用响铃功能

-l

忽略Ctrl+l(换页)字符

-p

通过清除窗口而不是滚屏来对文件进

行换页,与-c选项相似

-s

把连续的多个空行显示为一行

u

把文件内容中的下画线去掉

在查看一个内容较多,无法在一屏内显示的文件时,经常要用到more操作命令。常用的more操作命令及其说明见表6.24。

表6.24? 常用的more操作命令及其说明

操作命令

说????明

Enter

向下n行,需要定义。默认为1行

Ctrl+F

向下滚动一屏

空格键

向下滚动一屏

Ctrl+B

返回上一屏

=

输出当前行的行号

:f

输出文件名和当前行的行号

V

调用vi编辑器

!命令

调用Shell,并执行命令

q

退出more


例如要显示文件test中从第3行起的内容,命令行为:

  1. #more??+3??test?

再如使用"+/pattern"选项,从文件test中查找第一个出现"teacher"字符串的行,并从该处前两行开始显示输出,命令行为:

  1. #more??+/teacher??test?

若每屏显示8行,命令行为:

  1. #more??-8??test?

又如从终端顶部开始显示文件内容,并给出提示信息,命令行为:

  1. #more??-dc??test?

?

6.11.15? less 命令:显示文件时允许用户既可以向前又可以向后翻阅文件

less 命令和more命令功能相似,显示文件时允许用户既可以向前又可以向后翻阅文件。可以按pageup键向前翻,按pagedown键向后翻,要退出则按q键。less命令格式为:

  1. less?[选项]?文件名?

less命令的常用选项及其说明见表6.25。

表6.25? less命令选项及其说明

选????项

说????明

-c

从顶部(从上到下)刷新屏幕,并显示文

件内容,而不是通过底部滚动完成刷新

-f

强制打开文件,如果是二进制文件也不提出警告

-i

搜索时忽略大小写,但搜索串中包含大写字母除外

-I

搜索时忽略大小写,但搜索串中包含小写字母除外

-m

显示读取文件的百分比

-M

显示读取文件的百分比、行号及总行数

-N

在每行前输出行号

-p pattern

例如在/etc/ftpuser中搜索单词student,可

以使用“less??-p??student??/etc/ftpuser”

-S

把连续多个空白行作为一个空白行显示

-Q

在终端下不响铃


在用less命令查看文件时,使用一些常用的操作指令可以加快查找和定位的速度。常用的操作指令及其说明见表6.26。

表6.26? less常用的操作指令及其说明

操作命令

说????明

回车键

向下移动一行

?y

向上移动一行

空格键

向下滚动一屏

?b

向上滚动一屏

?d

向下滚动半屏

?h

less的帮助

?u

向上滚动半屏

?w

从指定行数的下一行显示,例如指

定的值是9,则从第10行开始显示

?g

跳到第一行

?G

跳到最后一行

p n%

跳到n%。例如50%,表示从整个

文档的50%处开始显示

?/pattern

搜索pattern,例如/ftpuser,表示从文

件中搜索单词ftpuser

?v

调用vi编辑器

?q

退出less

?!command

调用Shell命令,例如使用“!ls”,表

示列出当前目录下的所有文件


例如,查看当前目录下test文件的内容,命令行为:

  1. #less??test?

如果在显示文件example3内容的同时,加上行号,命令行为:

  1. #less??-N??example3 ?
  2. 1??aa?bb?cc?dd ?
  3. 2??bb?cc?dd?ee ?
  4. 3??cc?dd?ee?ff ?
  5. 4??dd?ee?ff?gg ?
  6. 5??ee?ff?gg?hh ?
  7. 6??ff?gg?hh?ii?

?

6.11.16? head 命令:查看文件前面的部分内容

cat命令会一次输出文件的全部内容,而head命令则用于查看文件前面的部分内容。head命令格式为:

  1. head??[-n]??文件名?

其中-n用于指定显示文件的前n行,如果未指定行数n,则使用默认值10。

例如,显示example文件的前5行,命令行为:

  1. #?head??-5??example?

tail 命令与head命令类似,用于显示文件后面的部分内容,默认显示末尾10行。命令格式为:

  1. tail??[+/-n]??文件名?

其中 "+ n"表示从文件的第n行开始显示。"- n"表示从距文件末尾n行处开始显示。例如显示文件test最后10行的内容,可以使用命令:

  1. #tail??-10??test?

再如从文件test的第10行开始显示文件的内容,可以使用命令:

  1. #tail??+10??test?

?

6.11.17? touch命令:改变文件的时间戳

touch命令用来改变文件的时间戳,如果file文件不存在,则创建该文件。例如,使用touch命令创建example文件:

  1. ?#?ls?-a ?
  2. .??.. ?
  3. #?touch??example ?
  4. #?ls??-a ?
  5. .??..??example?

然后可以使用touch命令更新其时间戳,命令如下:

  1. #?ls??-al ?
  2. drwxrwxr-x?2?root?root?4096?07-27?00:47?. ?
  3. drwxr-xr-x?6?root?root?4096?07-27?00:47?.. ?
  4. -rw-rw-r--?1?root?root????0?07-27?00:47?example??
    //创建时间为07-27?00:47 ?
  5. #?touch??example ?
  6. #?ls??-l??example ?
  7. -rw-rw-r--?1?root?root?0?07-27?00:48?example????
    //修改时间戳为07-27?00:48?

?

sort 命令:对文件中的所有行进行排序

sort命令用于对文件中的所有行进行排序,并将结果显示在屏幕上。sort命令的格式如下:

  1. sort??[选项]??文件列表?

各选项的意义如下。

-m:把已经排过序的文件列表合并成一个文件,并送往标准输出。

-c:检查给定的文件是否排过序。

-d:按字典顺序排序,可比较的字符仅包含字母、数字、空格和制表符。

-f:忽略大小写。

-r:按降序排序,默认是升序。

例如对文件student按字典顺序进行排序,命令行为:

  1. #?cat??student ?
  2. Tom?????A??B??C??D ?
  3. Mike????B??C??D??E ?
  4. Mary????C??D??E??F ?
  5. Jean????D??E??F??G ?
  6. #?sort??student ?
  7. Jean????D??E??F??G ?
  8. Mary????C??D??E??F ?
  9. Mike????B??C??D??E ?
  10. Tom?????A??B??C??D?

sort命令常和管道(|)联合使用,例如对当前目录的文件按字典顺序进行排列并显示:

  1. #?ls ?
  2. anaconda-ks.cfg??Desktop????install.log?????????man_chage ?
  3. chage_li?????????file1.doc??install.log.syslog ?
  4. #?ls??|??-d??sort???????????//按字典顺序排列 ?
  5. anaconda-ks.cfg ?
  6. chage_li ?
  7. Desktop ?
  8. file1.doc ?
  9. install.log ?
  10. install.log.syslog ?
  11. man_chage ?
  12. #?ls??|??sort??-r???????????//按降序排列文件 ?
  13. man_chage ?
  14. install.log.syslog ?
  15. install.log ?
  16. file1.doc ?
  17. Desktop ?
  18. chage_li ?
  19. anaconda-ks.cfg?

?

comm命令:对两个已排序文件逐行进行比较

comm 命令对两个已排序文件逐行进行比较,输出结果由三列组成,其中第一列表示仅在第一个文件出现的行,第二列表示仅在第二个文件出现的行,第三列表示在两个文件中都存在的行。comm命令格式为:

  1. comm??[-[1][2][3]]??file1??file2??

-[1][2][3]:分别表示不进行显示输出的列。

例如对文件student1和student2进行比较,显示其中的异同,命令行如下:

  1. #?cat??student1 ?
  2. Tom?is?a?tall?man ?
  3. Mike?is?Tom's?brother ?
  4. Mary?is?a?beautiful?girl ?
  5. Jean?is?Mary's?sister ?
  6. #?cat??student2 ?
  7. Tom?is?Mary's?brother ?
  8. Mike?is?Tom's?brother ?
  9. Mary?is?a?beautiful?girl ?
  10. Jean?is?Tom's?sister ?
  11. #?sort?student1?>?student1_1?????????//对student1排序??????????????????? ?
  12. #?sort?student2?>?student2_2?????????//对student2排序 ?
  13. #?cat?student1_1??student2_2 ?
  14. Jean?is?Mary's?sister ?
  15. Mary?is?a?beautiful?girl ?
  16. Mike?is?Tom's?brother ?
  17. Tom?is?a?tall?man ?
  18. Jean?is?Tom's?sister ?
  19. Mary?is?a?beautiful?girl ?
  20. Mike?is?Tom's?brother ?
  21. Tom?is?Mary's?brother ?
  22. #?comm??student1_1?student2_2 ?
  23. Jean?is?Mary's?sister ?
  24. ????????Jean?is?Tom's?sister ?
  25. ????????????????Mary?is?a?beautiful?girl ?
  26. ????????????????Mike?is?Tom's?brother ?
  27. Tom?is?a?tall?man ?
  28. ????????Tom?is?Mary's?brother??

?

diff 命令:比较两个文本文件,并显示它们的不同

diff 命令比较两个文本文件,并显示它们的不同,命令格式为:

  1. diff??文件1??文件2?

diff文件的输出结果及其说明见表6.27。

表6.27? diff文件的输出结果及其说明

输出结果形式

说????明

n1 a?n2

表示第一个文件的?n1行添加输出内容后

成为第二个文件的n2行

n1,n2 c?n3,n4

表示将第一个文件的n1到n2行(在<号之

后的内容)改变成第二个文件的n3到n4

行(在?>号之后的内容)

n1,n2 d n3

表示第一个文件中n1到n2行删除成

为文件2中的n3行


注意:a表示添加,c 表示改变,d 表示删除。

例如对文件student1、student2进行比较,并输出文件的不同之处,命令行为:

  1. #?cat??student1?????????????????????//student1文件内容 ?
  2. Tom?is?a?tall?man ?
  3. Mike?is?Tom's?brother ?
  4. Mary?is?a?beautiful?girl ?
  5. Jean?is?Mary's?sister ?
  6. #?cat??student2?????????????????????//student2文件内容 ?
  7. Tom?is?Mary's?brother ?
  8. Mike?is?Tom's?brother ?
  9. Mary?is?a?beautiful?girl ?
  10. Jean?is?Tom's?sister ?
  11. #?diff??student1??student2??????//比较结果 ?
  12. 1c1 ?
  13. <?Tom?is?a?tall?man ?
  14. --- ?
  15. >?Tom?is?Mary's?brother ?
  16. 4c4 ?
  17. <?Jean?is?Mary's?sister ?
  18. --- ?
  19. >?Jean?is?Tom's?sister?

?

6.11.21? cut命令:移出文件中的部分内容

cut命令用来移出文件中的部分内容。命令格式为:

  1. cut??[选项]??file?

其可用选项意义如下。

-c:显示每行中指定的字符。

例如显示student1文件中每行的第1到第10个字符,命令行为:

  1. #?cut??-c1-10??student1 ?
  2. Tom?is?a?t ?
  3. Mike?is?To ?
  4. Mary?is?a? ?
  5. Jean?is?Ma?

cut命令并没有改变源文件的内容,只是改变了显示方式,从下面的命令可以看到:

  1. #?cat??student1 ?
  2. Tom?is?a?tall?man ?
  3. Mike?is?Tom's?brother ?
  4. Mary?is?a?beautiful?girl ?
  5. Jean?is?Mary's?sister?

?

6.11.22? locate命令:查找所有名称中包含指定字符串的文件

locate命令用于查找所有名称中包含指定字符串的文件。locate命令通过已建立的数据库/var/lib/slocate来进行搜索,而不直接在硬盘中逐一寻找。因此使用locate比使用find命令更快、更简便。但因为locate是经由数据库来搜寻的,而数据库的更新一般是每天一次(多数在夜间进行),所以在数据库更新之前搜寻用户新建立的文件,locate命令是无法查到的。locate命令格式为:

  1. locate?字符串?

例如查找所有包含"shadow"字符串的文件名,命令行为:

  1. #?locate??shadow ?
  2. /etc/shadow ?
  3. /usr/bin/pgmdeshadow ?
  4. /usr/share/icons/gnome/16x16/stock/image/stock_shadow.png ?
  5. /usr/share/icons/gnome/16x16/stock/text/stock_fontwork-2dshadow.png ?
  6. …??…?

?

6.11.23? split命令:将一个文件拆分成几个文件

利用cat命令可以将多个文件的内容合并到一个文件中。与之相反,split命令用于将一个较大的文件拆分成大小相同的几个小文件。split命令的格式如下:

  1. split??[选项]??输入文件??输出文件前缀?

各选项意义如下。

-l n:将输入文件每n行拆分为一个文件,默认值为1 000。

-b n[bkm]:以字节为单位进行拆分,并设定每个拆分后的文件的大小。b代表512KB,k代表1KB,m代表1MB。

-:从标准输入读取数据。

例如对文件file进行拆分,每两行存为一个新文件,新文件名以"files"为前缀:

  1. #?ls ?
  2. file ?
  3. #?cat?file ?
  4. aaaaaaaaaaaaaa ?
  5. bbbbbbbbbbbbbb ?
  6. cccccccccccccc ?
  7. dddddddddddddd ?
  8. eeeeeeeeeeeeee ?
  9. ffffffffffffff ?
  10. #?split??-l?2??file??files?

可以看到文件file被拆分成了filesaa、filesab和filesac三个文件,如下所示:

  1. #?ls ?
  2. file??filesaa??filesab??filesac?

查看文件filesaa、filesab和filesac,可以看到每个文件包含两行,如下所示:

  1. #?more?filesa? ?
  2. :::::::::::::: ?
  3. filesaa ?
  4. :::::::::::::: ?
  5. aaaaaaaaaaaaaa ?
  6. bbbbbbbbbbbbbb ?
  7. :::::::::::::: ?
  8. filesab ?
  9. :::::::::::::: ?
  10. cccccccccccccc ?
  11. dddddddddddddd ?
  12. :::::::::::::: ?
  13. filesac ?
  14. :::::::::::::: ?
  15. eeeeeeeeeeeeee ?
  16. ffffffffffffff?

使用选项"-b"可以按大小对文件进行拆分。例如文件file为90字节,按每30字节一个文件进行拆分,新拆分后的文件以"filebysize"为前缀,命令行如下所示:

  1. #?ls??-l??file ?
  2. -rw-r--r--?1?root?root?90?08-09?00:22?file ?
  3. #?split??-b?30??file??filebysize?

可以看到文件file被拆分成了filebysizeaa、filebysizeab和filebysizeac三个文件,如下所示:

  1. #?ls ?
  2. file??filebysizeaa??filebysizeab??filebysizeac??

每个文件各为30字节,如下所示:

  1. #?ls??-l ?
  2. -rw-r--r--?1?root?root?90?08-09?00:22?file ?
  3. -rw-r--r--?1?root?root?30?08-09?00:26?filebysizeaa ?
  4. -rw-r--r--?1?root?root?30?08-09?00:26?filebysizeab ?
  5. -rw-r--r--?1?root?root?30?08-09?00:26?filebysizeac?

使用选项"-"可以从标准输入设备读入数据,并按设定值进行拆分。例如从标准键盘读入数据,每两行拆分成一个新文件,且新文件的前缀为"standinput",命令如下所示:

  1. #?split??-l??2??-??standinput ?
  2. aaaaaaaaaaaaaaaaaaaaaaaaaaa ?
  3. aaaaaaaaaaaaaaaaaaaaaaaaaaa ?
  4. bbbbbbbbbbbbbbbbbbbbbbbbbbb ?
  5. bbbbbbbbbbbbbbbbbbbbbbbbbbb ?
  6. ccccccccccccccccccccccccccc? ?
  7. ccccccccccccccccccccccccccc?

按Ctrl+d或Ctrl+c组合键结束文件的输入,然后使用命令ls查看读入的数据是否被拆分,如下所示:

  1. #?ls ?
  2. standinputaa??????standinputab????standinputac?

查看文件standinputaa、standinputab和standinputac,可以看到每个文件包含两行,如下所示:

  1. #?more?standinputa? ?
  2. :::::::::::::: ?
  3. standinputaa ?
  4. :::::::::::::: ?
  5. aaaaaaaaaaaaaaaaaaaaaaaaaaa ?
  6. aaaaaaaaaaaaaaaaaaaaaaaaaaa ?
  7. :::::::::::::: ?
  8. standinputab ?
  9. :::::::::::::: ?
  10. bbbbbbbbbbbbbbbbbbbbbbbbbbb ?
  11. bbbbbbbbbbbbbbbbbbbbbbbbbbb ?
  12. :::::::::::::: ?
  13. standinputac ?
  14. :::::::::::::: ?
  15. ccccccccccccccccccccccccccc ?
  16. ccccccccccccccccccccccccccc?

可以使用命名管道对标准输入进行重新指定,例如:

  1. #?ls??-al??/etc??|??split??-l?50??-??etcfile ?
  2. #?ls ?
  3. etcfileaa??etcfilead??etcfileab??etcfileae??etcfileac??etcfileaf?

该命令以ls长格式列出/etc目录下的所有文件,并把命令ls的输出结果通过命名管道输入split命令。由split命令按照每50行另存为一个新文件的方式,对输入的文件列表进行拆分。新拆分的文件以"etcfile"为前缀,一共生成了etcfileaa、etcfilead、etcfileab、etcfileae、etcfileac和etcfileaf总共6个文件。

?

6.11.24? IO重定向及管道操作

在Linux系统中,数据流可分为三类:数据输入、数据输出和错误输出。相应地,每一个进程也都有三个特殊的文件描述指针:标准输入(standard input,文件描述指针为0)、标准输出(standard output,文件描述指针为1)和标准错误输出(standard error,文件描述指针为2)。这三个特殊的文件描述指针使进程能在通常情况下接受标准输入设备的输入,并让标准输出设备显示输出。

标准输入通常指传给一个命令的键盘输入。例如运行命令"ls -al",其中"-al"是传给ls命令的标准输入。标准输出是一个命令的执行结果,例如运行"cat /file1.doc"命令后所看到的文件内容就是标准输出。标准输出通常被定向到显示器。如果在执行命令的过程中发生错误,可能会生成一条错误消息,这是标准错误数据流,通常也被定向到显示器。如在上例中,如果file1.doc文件不存在,则系统会提示"cat:/file1.doc:没有此文件或目录",并从显示器输出。

有两种基本的方法可以用来重定向标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。可以利用管道把这些数据流之一输送给另外一条命令;也可以利用I/O重定向把这些数据流之一重定向到一个文件。管道及I/O重新定向是Linux系统中特有的概念。所谓管道是指将某个命令的输出结果传送到另一个命令,当成另外一个命令的输入,其代表符号是"|"。所谓I/O重定向是指将命令执行的结果重新导出到其他的设备或文件(以">"或">>"来表示),或者重新导入到其他的设备或文件(以"<"或"<<"来表示)。常用输入输出重定向命令格式与说明如表6.28所示。

表6.28? 常用输入输出重定向命令格式与说明

命?令?行

说????明

命令1??>??文件1

将命令1的输出结果重定向到文件1

命令1??&>??文件1

将命令1的输出结果和标准

错误输出一起重定向到文件1

命令1??>>??文件1

将命令1的输出结果追加到文件1中

命令1??2>??文件1

将命令1的标准错误输出的

结果重定向到文件1中

命令1??<??文件1

将文件1作为命令1的标准输入

命令1??<<??字符串1

允许连续输入数据,直到接收到字符串1


1.输出重定向(>)

在Linux下执行任何命令或程序时,默认情况下都将把结果输出到屏幕,但是有时用户希望将标准输出保存到一个文件中,此时就可以使用输出重定向的功能。例如为/etc目录下的所有文件建立一个清单,并保存到/etc_list文件中,命令行为:

  1. #?ls??/etc??>??/etc_list ?
  2. #?cat??/etc_list???????//查看建立的列表文件 ?
  3. a2ps.cfg ?
  4. a2ps-site.cfg ?
  5. acpi ?
  6. adjtime ?
  7. ...??...?

在执行上例中的"ls"命令时,由于原来的输出对象的输出内容都已重新定向到/etc_list文件中,因此屏幕不会再显示任何输出结果。重定向的文件,如本例中的/etc_list,不需预先创建,系统在执行此命令时若发现重新定向的文件不存在,则会自动生成命令中指定的文件。若文件已经存在,则会进行写覆盖。可以使用附加输出重定向(>>)把新添加的数据追加到已存在文件的尾部,以避免写覆盖的发生。

利用前面介绍过的"cat"命令,配合输出重定向操作,可以将数据直接从键盘录入到文件中,例如创建file1.doc文件并录入"Hello world !!!", 按Ctrl+c或Ctrl+d组合键可以结束文件的编辑。相应命令行为:

  1. #?cat??>??file1.doc ?
  2. Hello?World!!!????????//按Enter键 ?
  3. 按<Ctrl+c>或<Ctrl+d>组合键 ?
  4. #?

在输入完毕后先按Enter键(否则最后一行不会存储),再按Ctrl+c或Ctrl+d组合键就可结束文件的编辑,系统会将此内容以file1.doc文件名进行存储。???

2.附加输出重定向(>>)

如果重新定向的文件原来已经存在,那么在使用输出重定向(>)给文件输入新的数据后,新数据将覆盖所有旧的数据。在硬盘空间足够的条件下,为了避免覆盖旧数据,可以采用Linux提供的"附加输出重定向"(>>)技术。附加输出重定向操作可以将新输入的数据附加(Append)在原有旧数据之后,表示符号为">>"。从下例中可以看出输出重定向与附加输出重定向的区别:

  1. #?cat?file1.doc ?
  2. Hello?World!!!??????????//源文件内容 ?
  3. #?cat?>?file1.doc ?
  4. This?is?a?new?world! ?
  5. #?cat?file1.doc ?
  6. This?is?a?new?world!???//源文件内容被覆盖 ?
  7. #?cat?>>?file1.doc ?
  8. I?like?this?world. ?
  9. #?cat?file1.doc?????????//附加在源文件后 ?
  10. This?is?a?new?world! ?
  11. I?like?this?world.?

3.输入重定向(<)

输出重定向与输入重定向相反,前者是将命令或程序的执行结果通过屏幕或文件来输出,后者是将输入设备(如键盘或文件)提供给命令来执行。例如下面的程序对/etc目录进行备份,其中使用了输入重定向来读入file文件的内容:

  1. #!/bin/sh ?
  2. i=0; ?
  3. find?/?-name?etc?>?file; ?
  4. while?read?LINE ?
  5. do? ?
  6. ??DIRS=$LINE ?
  7. ??BACKUP="/tmp/backup${i}.tar.gz"?
  8. ??tar?-zcvf??$BACKUP??$DIRS ?
  9. ??i=$(($i+1)) ?
  10. done?<?file?

4.附加输入重定向(<<字符串)

附加输入重定向经常用于电子邮件系统中,可以让用户自行定义一个字符串,例如exit,系统在收到此字符串前,会持续地将数据输入文件。下面是一个编写电子邮件的范例,定义的结束字符串是"exit",用户可以连续输入邮件内容,直到输入"exit":

  1. #?mail?yang_mh@bit.edu.cn?<<?exit?
  2. >?This?mail?is?a?test. ?
  3. >?exit?

5.错误输出重定向(2>)

输出重定向(>)操作在命令执行发生错误时,将把错误信息直接显示在屏幕上,并且不记录到文件中。而错误输出重定向(2>)会在命令执行发生错误时,将错误信息直接输入到文件中,不会再将信息结果显示在屏幕上。例如:

  1. #?ls ?
  2. cal_txt????finger2_txt??groups_txt??last_txt?
    newgrp_txt??suple_txt??who.txt ?
  3. file1.doc??finger3_txt??groups_txt2??ll??????
    suple3_txt???suple_txt~??w.txt ?
  4. file2.doc??finger_txt???id_txt???????ln??????
    suple3_txt~??w ?
  5. #?ls??exec ?
  6. ls:?exec:?没有那个文件或目录 ?
  7. #?ls?exec??2>?example ?
  8. #?cat?example ?
  9. ls:?exec:?没有那个文件或目录?

6.标准输出与错误输出重定向(&>)

标准输出与错误输出重定向(&>)可以将标准输出和错误输出信息一并重定向到文件,屏幕上不会显示任何信息,例如:

  1. #?ls ?
  2. cal_txt????file2.doc????finger_txt???id_txt???
    ln??????????suple3_txt~??w ?
  3. example????finger2_txt??groups_txt???last_txt??
    newgrp_txt??suple_txt?who.txt ?
  4. file1.doc??finger3_txt??groups_txt2??ll???????
    suple3_txt??suple_txt~???w.txt ?
  5. #?ls?id_txt?file ?
  6. ls:?file:?没有那个文件或目录 ?
  7. id_txt ?
  8. #?ls??id_txt?file??2>??doc???????????//将错误输出重定向到文件doc ?
  9. id_txt ?
  10. #?cat??doc ?
  11. ls:?file:?没有那个文件或目录 ?
  12. #?ls??id_txt?file?&>?doc??????????//将标准输出与错误输出一并重定向到文件doc ?
  13. #?cat??doc ?
  14. ls:?file:?没有那个文件或目录 ?
  15. id_txt?

7.管道(Pipe)

在Linux系统中,管道的主要功能是将其他程序的输出结果直接导出到另一个程序来做输入数据,即将前一个程序的输出作为后一个程序的输入,符号表示为"|"。管道的语法格式为:

  1. 命令1??|??命令2??[?|??命令3?…?]?

可以将标准错误输出一起送入管道,命令格式为:

  1. 命令1??|&??命令2??[?|&??命令3?…?]?

例如将ps命令的输出结果作为more命令的输入,以实现分页查看进程信息,命令行为:

  1. #ps??-aux??|??more?

再如以长格式查看/etc目录下的所有文件。由于/etc目录下的文件很多,因此直接使用"1s? -al"命令显示的内容会很快卷过屏幕,无法仔细查看。可以利用管道将"1s? -al"命令的执行结果输入more或less命令,实现分页显示,命令行为:

  1. #ls??-al??|??less?

?

热点排行