关于xargs,你可能不知道的

标签: 分类?没有 | 发表时间:2011-07-19 09:11 | 作者:yuanyi Caiwangqin
出处:http://heikezhi.com

如果你曾经花了许多时间在Unix命令行上,那么或许你已经见过xargs了,如果你还没听过xargs,那就先让我来解释下,xargs是一个从标准输入或许参数并执行命令的程序。

常见使用

我常常见到将find和xargs组合使用以对find返回的文件列表执行某些操作。

更新:根据Twitter和hacker news上的反馈,find是个很强大的命令,它自己也有-exec和-delete这样的参数可以用来执行命令和删除文件,尽管如此,如果你对find的这些选项不太了解,或是想不起来-exec那古怪的语法,那么你还是可以使用更为简单的xargs,并且xargs在效率上也更胜一筹。

递归查找所有Python文件并统计文件行数

find . -name ‘*.py’ | xargs wc -l

递归查找所有Emacs备份文件并删除:

find . -name ‘*~’ | xargs rm

递归查找所有Python文件并搜索import语句:

find . -name ‘*.py’ | xargs grep ‘import’

处理文件/目录名中的空格

上面的例子有一个问题,如果文件或是目录名含有空格,则可能会有些问题,这是因为xargs默认会按照空白自负来划分输入。一个简单的解决办法就是告诉find使用NUL(\0)来分割结果(通过向find提供-print0选项),并且告诉xargs也使用Nul来分隔输入(-0)。

删除备份文件,即使含有空格:

find . -name ‘*~’ -print0 | xargs -0 rm

参数位置

上面的例子中xargs从标准输入读取所有非空的元素并将他们连接起来提供给给定的命令进行执行,这在很多情况下会非常有用,尽管如此,有时你可能想要在命令中间插入一个参数,此时-J标记就排上用场了,xargs会为-J参数后面的字符串加上输入然后在执行。

将所有备份文件复制到backups目录下:

find . -name ‘*~’ -print 0 | xargs -0 -J % cp % ~/backups

最大命令长度

有时通过管道传递给xargs的输入可能会造成要执行的命令超出最大命令行长度限制,你可以通过下面的命令得到命令行的最大长度:

getconf ARG_MAX

为了避免越限,xargs对于结果命令有它自己的最大长度限制,如果提供的参数有可能会造成调用的命令超出长度限制,则xargs会将输入分割成多个部分,并多次调用目标命令,默认的长度限制是4096,这可能要远远小于大多数现在系统的ARG_MAX设置,你可以通过向xargs提供-s标识来覆盖这个默认设置,当你对一个很大的源代码仓库进行操作时,这会显得尤其有用。

指定参数数量

如果你要执行的命令只接受1个或是2个参数,比如使用diff命令来对2个文件进行比较,那么xargs的-n选项就会非常有用,它可以指定一次向目标命令提供几个参数,如果参数数量多于你制定的数量,则命令将会被重复调用,直到所有输入都已经得到执行。注意,最后一次调用的参数有可能会少于指定的参数数量,下面让我们来看一个简单的例子:

$ echo {0..9} | xargs -n 2

0 1
2 3
4 5
6 7
8 9

同样的,你也可以使用-L参数制定每次只对某几行的输入进行操作,比如-L 1将每次从输入中取一行作为参数传递给待执行的命令,当然,你可以将1改为任意行,但1是最常用的,下面这条命令将演示如何得到每个git commit的代码变化:

git log –format=”%H %P” | xargs -L 1 git diff

并行执行命令

你或许会使用xargs调用某些需要密集计算的命令,如果xargs可以利用你电脑上的多核计算能力,那该有多美妙?没错,-P参数就是干这个的,通过这个参数xargs可以一次并行的调用多个命令,举个例子,你可以通过它来并行的运行多个ffmpeg编码器,不过,还是让我们来个更简单一点的例子吧:

并行休眠

$ time echo {1..5} | xargs -n 1 -P 5 sleep

real 0m5.013s
user 0m0.003s
sys 0m0.014s

线性休眠

$ time echo {1..5} | xargs -n 1 sleep

real 0m15.022s
user 0m0.004s
sys 0m0.015s

如果你对使用xargs进行并行计算感兴趣,那么你或许应该看看GNU parallel,相比较而言,xargs的优势就是大多数系统默认都支持它,并且在BSD和OS X上也可以很容易的安装,但是parallel则有许多非常赞的特性。

如果你发现这篇帖子有用,别忘了在Twitter Follow下我哦。

———–
本文来自“Things you (probably) didn’t know about xargs”,作者:Cosmin Stejerean

想和我们一道传播黑客精神?快来加入吧!

相关 [xargs 知道] 推荐:

关于xargs,你可能不知道的

- Caiwangqin - 黑客志
如果你曾经花了许多时间在Unix命令行上,那么或许你已经见过xargs了,如果你还没听过xargs,那就先让我来解释下,xargs是一个从标准输入或许参数并执行命令的程序. 我常常见到将find和xargs组合使用以对find返回的文件列表执行某些操作. 更新:根据Twitter和hacker news上的反馈,find是个很强大的命令,它自己也有-exec和-delete这样的参数可以用来执行命令和删除文件,尽管如此,如果你对find的这些选项不太了解,或是想不起来-exec那古怪的语法,那么你还是可以使用更为简单的xargs,并且xargs在效率上也更胜一筹.

百度知道XSS漏洞

- - 博客园_首页
事情的起因是我一同学在百度知道上看到一个很奇怪的,正文带有连接的提问( 这里),正常来说,这种情况是不可能出现的. 我条件反射的想到了:XSS漏洞. 通过查看源代码,我马上发现了问题的根源:未结束的标签.
帮我写一个能提取

那些你知道和不知道的千纸鹤

- Brandon - DIY - 果壳网
千纸鹤是一件经典折纸作品,理工男现在就要利用几何知识打破经典,开拓创新. 申明:本文所述作品(除最后一只翻转鹤)均属原创,如有雷同,纯属英雄所见略同. 你将需要的工具和材料有:. 10   一刀纸鹤(非原创). 12   DIYer签到处 12.1   大手牵小手. 正方形是用来折纸的一种完美形状,想要创新,首先就要突破正方形的限制.

社交搜索——百度知道,不如你我知道

- - 微博之博
本篇文章作者王德超,程序员一枚,创业在路上,微博@哀木涕啊. 当你想订购一台吐司机的时候,你会去哪儿寻找参考信息. 我想大概有许多人像我一样,习惯了使用Google 、百度或者Bing. 但他们真的会给我们最需要的答案吗. 作为一名使用微博3年以上的老围脖,突然发现自己在搜索答案时出现了另一个习惯.

推荐技术随谈,你知道的或者不知道的

- - IT瘾-dev
大家好,今天想和大家讨论下相关推荐技术通用的特点及在实践中的改进点,这也是我们团队在研发实践中一些经验总结. 首先,推荐解决主要问题是给用户在没有行为的新闻上预测一个偏好概率,然后通过概率值由高到低排序推荐给用户. 如图简单地表达了用户在新闻上的稀疏行为矩阵,通过我们会基于用户的画像特征、内容特征、上下文场景特征、用户对新闻的各种操作行为特征等对内容候选集进行排序打分.

我知道你为什么拖延

- Newton - 心事鉴定组 - 果壳网
经验说:事情越欠越多,都是因为拖延症. 实验说:拖延症是因为你总是无法战胜眼前的欲望. 我们在网上下载了一大堆电影、纪录片,用途却是拿来塞满硬盘,从没看过;我们买回一大堆书,准备读完这些名家大著、哲学经典什么的来充实自己,可实际上这些书跟着你回家后,放在书架上就再也没拿下来过,日复一日地积累灰尘. 尽管如此,我们仍然乐此不疲地下载一部又一部的电影,买一本又一本的书,以为未来的某天,自己会良心发现把它们看完.

我知道这个梗很lag,但……

- wyt - 工口堂
分类: acg | 评论数: 16.

护士都知道,医生都明白

- ji - 乐淘吧
乙酰螺旋霉素片+人工牛黄【消炎】. 干咳:百合固定口服液 养阴清肺. 黄痰:急支糖浆 肺力咳合剂 等等. 白痰和黄痰都可以使用:镇咳宁含片. 眼药:复方硫酸软骨(润洁)【保健】. 四味珍层冰硼滴眼液(珍视明滴眼液). 眼药水开封后,一个月内使用完,不然会氧化. 慢性鼻炎:鼻炎片(中联) 千柏鼻炎片(奇星) 鼻炎康片(德众).

不知道为啥ifttt也能火

- http://groups.google.com/group/dotnet_cn - hUrR DuRr
Google Plus出来这几天,还有一个很火的就是If This Then That. 不明白啊,ifttt这软件不是第一个,也不是做得最好的,这个邀请泡沫就那么迷人嘛. 几个月前参加beta看了下,ifttt的功能简直弱暴了:. 中心化抓取服务,肯定是延迟超高的瓶颈. 既然是中心化的,被abuse了,然后被各大hosting和ICP封IP也是意料中的.

你可能不知道的性

- 总统 - 性 情 - 果壳网