Linux中xargs的用法

jLawrencee 2011-09-01

xargs

大多数Linux命令都会产生输出:文件列表、字符串列表等。但如果要使用其他某个命令并将前一个命令的输出作为参数该怎么办?例如,file命令显示文件类型(可执行文件、ascii文本等);你能处理输出,使其仅显示文件名,目前你希望将这些名称传递给ls-l命令以查看时间戳记。xargs命令就是用来完成此项工作的。他允许你对输出执行其他某些命令。记住下面这个来自于第1部分中的语法:

例1:

file-Lz*|grepASCII|cut-d":"-f1|xargsls-ltr

让我们来剖析这个命令字符串。第一个,file-Lz*,用于查找是符号链接或经过压缩的文件。他将输出传递给下一个命令grepASCII,该命令在其中搜索"ASCII"字符串并产生如下所示的输出:

alert_DBA102.log:ASCIIEnglishtext

alert_DBA102.log.Z:ASCIItext(compress’ddata16bits)

dba102_asmb_12307.trc.Z:ASCIIEnglishtext(compress’ddata16bits)

dba102_asmb_20653.trc.Z:ASCIIEnglishtext(compress’ddata16bits)

由于我们只对文件名感兴趣,因此我们应用下一个命令cut-d":"-f1,仅显示第一个字段:

alert_DBA102.log

alert_DBA102.log.Z

dba102_asmb_12307.trc.Z

dba102_asmb_20653.trc.Z

目前,我们希望使用ls-l命令,将上述列表作为参数进行传递,一次传递一个。xargs命令允许你这样做。最后一部分,xargsls-ltr,用于接收输出并对其执行ls-ltr命令,如下所示:

ls-ltralert_DBA102.log

ls-ltralert_DBA102.log.Z

ls-ltrdba102_asmb_12307.trc.Z

ls-ltrdba102_asmb_20653.trc.Z

因此,xargs本身虽然没有多大用处,但在和其他命令相结合时,他的功能非常强大。

下面是另一个示例,我们希望计算这些文件中的行数:

例2:

$file*|grepASCII|cut-d":"-f1|xargswc-l

47853alert_DBA102.log

19dba102_cjq0_14493.trc

29053dba102_mmnl_14497.trc

154dba102_reco_14491.trc

43dba102_rvwr_14518.trc

77122total

(注:上述任务还可用以下命令完成:)

$wc-l‘file*|grepASCII|cut-d":"-f1|grepASCII|cut-d":"-f1‘

该xargs版本用于阐释概念。Linux能用几种方法来完成同一个任务;请使用最适合你的情况的方法。

使用该方法,你能快速重命名目录中的文件。

例3:

$ls|xargs-t-imv{}{}.bak

-i选项告诉xargs用每项的名称替换{}。-t选项指示xargs先打印命令,然后再执行。

另一个非常有用的操作是当你使用vi打开要编辑的文件时:

例4:

$file*|grepASCII|cut-d":"-f1|xargsvi

该命令使用vi逐个打开文件。当你希望搜索多个文件并打开他们进行编辑时,使用该命令非常方便。

他更有几个选项。最有用的可能是-p选项,他使操作具有可交互性:

例5:

$file*|grepASCII|cut-d":"-f1|xargs-pvi

vialert_DBA102.logdba102_cjq0_14493.trcdba102_mmnl_14497.trc

dba102_reco_14491.trcdba102_rvwr_14518.trc?...

此处的xarg需求你在运行每个命令之前进行确认。如果你按下"y",则执行命令。当你对文件进行某些可能有破坏且不可恢复的操作(如删除或覆盖)时,你会发现该选项非常有用。

-t选项使用一个周详模式;他显示要运行的命令,是调试过程中一个非常有帮助的选项。

如果传递给xargs的输出为空怎么办?考虑以下命令:

例6:

$file*|grepSSSSSS|cut-d":"-f1|xargs-twc-l

wc-l

$

在此处,搜索"SSSSSS"后没有匹配的内容;因此xargs的输入均为空,如第二行所示(由于我们使用-t这个周详选项而产生的结果)。虽然这可能会有所帮助,但在某些情况下,如果没有要处理的内容,你可能希望停止xargs;如果是这样,能使用-r选项:

例7:

$file*|grepSSSSSS|cut-d":"-f1|xargs-t-rwc-l

$

如果没有要运行的内容,该命令退出。

假设你希望使用rm命令(该命令将作为xargs命令的参数)删除文件。然而,rm只能接受有限数量的参数。如果你的参数列表超出该限制怎么办?xargs的-n选项限制单个命令行的参数个数。

下面显示了怎么限制每个命令行仅使用两个参数:即使向xargsls-ltr传递五个文件,但每次向ls-ltr仅传递两个文件。

例8:

$file*|grepASCII|cut-d":"-f1|xargs-t-n2ls-ltr

ls-ltralert_DBA102.logdba102_cjq0_14493.trc

-rw-r-----1oracledba738Aug1019:18dba102_cjq0_14493.trc

-rw-r--r--1oracledba2410225Aug1305:31alert_DBA102.log

ls-ltrdba102_mmnl_14497.trcdba102_reco_14491.trc

-rw-r-----1oracledba5386163Aug1017:55dba102_mmnl_14497.trc

-rw-r-----1oracledba6808Aug1305:21dba102_reco_14491.trc

ls-ltrdba102_rvwr_14518.trc

-rw-r-----1oracledba2087Aug1004:30dba102_rvwr_14518.trc

使用该方法,你能快速重命名目录中的文件。

比较实用的应用

$ls|xargs-t-imv{}{}.bak

-i选项告诉xargs用每项的名称替换{}。

删除数量比较多的文件

ls|xargs-n20rm-fr

ls当然是输出所有的文件名(用空格分割)

xargs就是将ls的输出,每20个为一组(以空格为分隔符),作为rm-rf的参数

也就是说将所有文件名20个为一组,由rm-rf删除,这样就不会超过命令行的长度了

相关推荐