温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Linux系统中使用xargs命令的教程

发布时间:2021-09-03 15:59:07 来源:亿速云 阅读:126 作者:chen 栏目:系统运维

本篇内容主要讲解“Linux系统中使用xargs命令的教程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux系统中使用xargs命令的教程”吧!

xargs命令有两个要点。第一,你必须列出目标文件。第二,你必须指定对每个文件需要执行的命令或脚本。

这篇教程会涉及三个应用场景,xargs命令被用来处理分布在不同目录下的文件:

  1.     计算所有文件的行数
        打印指定文件的第一行
        对每个文件执行一个自定义脚本

请看下面这个叫xargstest的目录(用tree命令以及-i和-f选项显示了目录树结构,这样可以避免缩进显示而且每个文件都会带有完整路径):

    $ tree -if xargstest/ 
    Linux系统中使用xargs命令的教程

    这六个文件的内容分别如下:
    Linux系统中使用xargs命令的教程

    这个xargstest目录,以及它包含的子目录和文件将用在下面的例子中。
场景1:计算所有文件的行数

就像之前提到的,使用xargs命令的第一个要点是一个用来运行命令或脚本的文件列表。我们可以用find命令来确定和列出目标文件。选项-name 'file??'指定了xargstest目录下那些名字以"file"开头并跟随两个任意字符的文件才是匹配的。这个搜索默认是递归的,意思是find命令会在xargstest和它的子目录下搜索匹配的文件。

   

代码如下:

$ find xargstest/ -name 'file??'

   

代码如下:

xargstest/dir3/file3B
   xargstest/dir3/file3A
   xargstest/dir1/file1A
   xargstest/dir1/file1B
   xargstest/dir2/file2B
   xargstest/dir2/file2A

我们可以通过管道把结果发给sort命令让文件名按顺序排列:

   

代码如下:

$ find xargstest/ -name 'file??' | sort

   

代码如下:

xargstest/dir1/file1A
   xargstest/dir1/file1B
   xargstest/dir2/file2A
   xargstest/dir2/file2B
   xargstest/dir3/file3A
   xargstest/dir3/file3B

然后我们需要第二个要素,就是需要执行的命令。我们使用带有-l选项的wc命令来计算每个文件包含的换行符数目(会在输出的每一行的前面打印出来):

   

代码如下:

$ find xargstest/ -name 'file??' | sort | xargs wc -l

    

代码如下:

1 xargstest/dir1/file1A
    2 xargstest/dir1/file1B
    3 xargstest/dir2/file2A
    4 xargstest/dir2/file2B
    5 xargstest/dir3/file3A
    6 xargstest/dir3/file3B
   21 total

可以看到,不用对每个文件手动执行一次wc -l命令,而xargs命令可以让你在一步里完成所有操作。那些之前看起来无法完成的任务,例如单独处理数百个文件,现在可以相当轻松地完成了。
场景2:打印指定文件的第一行

既然你已经有一些使用xargs命令的基础,你可以自由选择执行什么命令。有时,你也许希望只对一部分文件执行操作而忽略其他的。在这种情况下,你可以使用find命令的-name选项以及?通配符(匹配任意单个字符)来选中特定文件并通过管道输出给xargs命令。举个例子,如果你想打印以“B”字符结尾的文件而忽略以“A”结尾的文件的第一行,可以使用下面的find、xargs和head命令组合来完成(head -n1会打印一个文件的第一行):

   

代码如下:

$ find xargstest/ -name 'file?B' | sort | xargs head -n1

   

代码如下:

==> xargstest/dir1/file1B <==
   one
   
   ==> xargstest/dir2/file2B <==
   one
   
   ==> xargstest/dir3/file3B <==
   one

你将看到只有以“B”结尾的文件会被处理,而所有以“A”结尾的文件都被忽略了。
场景3:对每个文件执行一个自定义脚本

最后,你也许希望对一些文件执行一个自定义脚本(例如Bash、Python或是Perl)。要做到这一点,只要简单地用你的自定义脚本名字替换掉之前例子中的wc和head命令就好了:

   

代码如下:

$ find xargstest/ -name 'file??' | xargs myscript.sh

自定义脚本myscript.sh需要写成接受一个文件名作为参数并处理这个文件。上面的命令将为find命令找到的每个文件分别调用脚本。

注意一下上面的例子中的文件名并没有包含空格。通常来说,在Linux环境下操作没有空格的文件名会舒服很多。如果你实在是需要处理名字中带有空格的文件,上边的命令就不能用了,需要稍微处理一下来让它可以被接受。这可以通过find命令的-print0选项(它会打印完整的文件名到标准输出,并以空字符结尾),以及xargs命令的-0选项(它会以空字符作为字符串结束标记)来实现,就像下面的例子:

   

代码如下:

$ find xargstest/ -name 'file*' -print0 | xargs -0 myscript.sh

注意一下,-name选项所跟的参数已经改为'file*',意思是所有以"file"开头而结尾可以是任意字符的文件都会被选中。

到此,相信大家对“Linux系统中使用xargs命令的教程”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI