如何在Linux里使用xargs命令

如何在Linux里使用xargs命令

你是否遇到过这样的情况,需要一遍又一遍地对多个文件执行同样的操作?如果有过,那你肯定会深有感触这是多么的无聊和效率低下。还好有种简单的方式,可以在基于Unix的操作系统中使用xargs命令解决这个烦恼。通过这个命令你可以有效地处理多个文件,节省你的时间和精力。在这篇教程中,你可以学到如何一次性对多个文件执行命令或脚本操作,再也不用担心像单独处理无数个日志或数据文件那样吓人的任务了。

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

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

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

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


  1. $ tree -if xargstest/

这六个文件的内容分别如下:

这个xargstest目录,以及它包含的子目录和文件将用在下面的例子中。

场景1:计算所有文件的行数

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


  1. $ find xargstest/ -name 'file??'


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

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


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


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

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


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


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

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

场景2:打印指定文件的第一行

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


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


  1. ==> xargstest/dir1/file1B <==
  2. one
  3.  
  4. ==> xargstest/dir2/file2B <==
  5. one
  6.  
  7. ==> xargstest/dir3/file3B <==
  8. one

你将看到只有以“B”结尾的文件会被处理,而所有以“A”结尾的文件都被忽略了。

场景3:对每个文件执行一个自定义脚本

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


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

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

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


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

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

总结

在看完这篇教程后你应该会理解xargs命令的作用,以及如何应用到自己的工作中。很快你就可以有时间享受这个命令所带来的高效率,而不用把你的时间耗费在一些重复的任务上了。想了解更详细的信息以及更多的选项,你可以在终端中输入'man xargs'命令来查看xargs的文档。

原文发布时间:2014-11-13

本文来自云栖合作伙伴“linux中国”

时间: 2024-09-20 05:38:21

如何在Linux里使用xargs命令的相关文章

Linux基础:xargs命令

简介 xargs可以将输入内容(通常通过命令行管道传递),转成后续命令的参数,通常用途有: 命令组合:尤其是一些命令不支持管道输入,比如ls. 避免参数过长:xargs可以通过-nx来将参数分组,避免参数过长. 使用语法如下 Usage: xargs [OPTION]... COMMAND INITIAL-ARGS... Run COMMAND with arguments INITIAL-ARGS and more arguments read from input. 入门例子 首先,创建测试

如何在Linux的命令行中使用Evernote

如何在Linux的命令行中使用Evernote 这周让我们继续学习如何使用Linux命令行管理和组织信息.在命令行中管理你的个人花费后,我建议你在命令行中管理你的笔记,特别是当你用Evernote记录笔记时.要是你从来没有听说过它,Evernote 专门有一个用户友好的在线服务可以在不同的设备间同步笔记.除了提供花哨的基于Web的API,Evernote还发布了在Windows.Mac.Android和iOS上的客户端.然而至今还没有官方的Linux客户端可用.老实说在众多的非官方Linux客户

如何在 Linux 中使用 Alpine 在命令行里访问 Gmail

如何在 Linux 中使用 Alpine 在命令行里访问 Gmail 假如你是一个命令行爱好者,我很确信你会使用这个强大的工作环境来执行哪怕是一项日常任务的工具,并为之欢呼,例如从 安排日程 . 管理财务 到 获取 Facebook .Twitter等任务.(LCTT 译注:阅读本文的另一个前提是,假如你还能访问 Gmail 或者知道 Gmail 是什么的话.) 在这个帖子中,我将为你展示 Linux 命令行的另一个漂亮干练的使用案例:访问 Google 的 Gmail 服务,为此,我们将使用

如何在Linux中用命令行工具管理KVM虚拟环境

如何在Linux中用命令行工具管理KVM虚拟环境 在我们KVM系列专题的第四部分,我们将会一起讨论下在命令行界面下来管理KVM环境.我们分别用'virt-install'和virsh命令行工具来创建并配置虚拟机和存储池,用qemu-img命令行工具来创建并管理磁盘映像. Linux系统的KVM管理 在这篇文章里没有什么新的概念,我们只是用命令行工具重复之前所做过的事情,也没有什么前提条件,都是相同的过程,之前的文章我们都讨论过. 第一步: 配置存储池 Virsh命令行工具是一款管理virsh客户

如何在Linux命令行中创建以及展示演示稿

如何在Linux命令行中创建以及展示演示稿 你在准备一场演讲的时候,脑海可能会先被图文并茂.形象华丽的演示图稿所占据.诚然,没有人会否认一份生动形象的演讲稿所带来的积极作用.然而,并非所有的演讲都需要TED Talk的质量.更多时候,演讲稿只为传达特定的信息. 而这个,使用文本信息足以完成.在这种情况下,你的时间可以更好的花在信息的搜集和核实上面,而不是在谷歌图片搜索(Google Image)上寻找好看的图片. 在Linux的世界里,有几个不同的方式供你选择来做演讲.比如带有大量多媒体展示.视

LFCS 系列第一讲:如何在 Linux 上使用 GNU sed 等命令来创建、编辑和操作文件

LFCS 系列第一讲:如何在 Linux 上使用 GNU sed 等命令来创建.编辑和操作文件 Linux 基金会宣布了一个全新的 LFCS(Linux 基金会认证系统管理员Linux Foundation Certified Sysadmin)认证计划.这一计划旨在帮助遍布全世界的人们获得其在处理 Linux 系统管理任务上能力的认证.这些能力包括支持运行的系统服务,以及第一手的故障诊断.分析,以及为工程师团队在升级时提供明智的决策. Linux 基金会认证系统管理员--第一讲 请观看下面关于

如何在Linux上使用命令行管理密码

如何在Linux上使用命令行管理密码 在基于密码的认证在网络盛行的今天,你可能需要或者已经使用了某种密码管理工具来跟踪管理你正在使用的所有密码.有各种各样的在线或离线服务或者软件工具用于完成此类事情,而这些工具因复杂程度.用户界面或者目标环境(如企业或终端用户)的不同而各不相同.例如,有一些是为终端用户开发基于图形化的密码管理器,如KeePass(X). 对于那些不想要依赖图形化进行密码管理的用户,笔者将会讲述如何在命令行下使用 pass来管理密码,这是一个简单的用于命令行管理密码的工具. 该密

如何在linux上分享你shell命令的输出

如何在linux上分享你shell命令的输出 前段时间我发布了一篇关于shelr.tv这个网站的文章,它提供一个服务允许你从网站上直接分享你的终端记录. 现在shelr.tv这个网站似乎关闭了,然后我四处寻找是否有类似的网站,于是我发现了commands.com. 从它的主页上来看,它的服务和其他网站提供的服务是类似的,因此让我们来测试它. 步骤 1 – 在网站上注册 只需要注册一个新的 用户名/密码,或者直接使用你的github账户快速登录. 步骤 2 – 下载安装monitor程序 Moni

c-求问如何在linux中实现类似top这样,可以不断刷新屏幕字符的命令?

问题描述 求问如何在linux中实现类似top这样,可以不断刷新屏幕字符的命令? 我的要求是,不断刷新屏幕中显示的字符串. 比如我在屏幕中输出abc,每秒变换一次,下一秒钟也许就变成了def了. 如果只是printf(),那不会覆盖原来的abc,只会在abc后面增加def而已. 我知道有个curses库函数. 不过这个使用总感觉比较困难,难道top命令也是用那个实现的? 解决方案 我也是刚刚解决这个问题,不知道现在回答你还晚不晚,但是不管怎么样,我觉得还是回一下比较好.一方面,可能你还没解决这个