当前位置: 首页 > news >正文

【-exec和xargs】-exec和xargs的区别

-exec和xargs的区别

当你在命令行执行:

$find . -name 'core' -type f -exec rm {} /;

时,find -exec 命令会对每个匹配的文件执行一个单独的rm操作(execute a separate rm for each one), 正如你手动敲入下面命令:

 
       
rm ./bin/core
rm ./source/shopping_cart/core
rm ./backups/core ...

但是使用这种方式,如果有100个文件匹配了,那么就需要启100个进程,一个进程处理一个rm命令。一般来说,其越多进程,意味着越耗性能。我们可以换个思路,我们将要删除文件当作参数传递给rm不就可以了吗?也就是说:

 
       
rm ./bin/core
rm ./source/shopping_cart/core
rm ./backups/core ...

改成:

rm ./bin/core ./source/shopping_cart/core ./backups/core

      

但是前提是后面的命令必须支持多参数。相有些命令,比如unzip,就不支持输入多个jar包,所以必须用-exec。
xargs,顾名思义,是对参数进行处理的命令。它的任务就是将输入行转换成下一个命令的参数列表。因此上面的find -exec命令可以改写成:

find . -name 'core' -type f -print | xargs rm

      

With this approach, xargs bundles together as many filename arguments as possible for submission to each invocation of rm that's needed, in compliance with the OS's maximum allowed size for an argument list. This means xargs is guaranteed not only to handle all the arguments, but also to use the smallest possible number of processes in doing so. For example, if each command can handle 100 arguments, and there are 110 filenames to process, there will be two invocations of the command, respectively handling 100 and 10 arguments.

其中操作系统允许的最大参数长度由如下命令得到:

forrest@ubuntu:~$ getconf ARG_MAX
2097152

      

这意味着xargs保证不会因为参数过多而挂掉。所以目前看来唯一需要保证的就是后面的命令支持多参数。比如前面说过的unzip,就不支持多参数,如果你使用xargs xxx.jar

 
       
forrest@ubuntu:~/work/intl-standalone/searchaddbuild/deploy/WORLDS-INF/lib$ unzip -l alibaba-intl-biz-account-api-1.0-Dev.jar Archive: alibaba-intl-biz-account-api-1.0-Dev.jar Length Date Time Name --------- ---------- ----- ---- 0
2010-11-24 19:43 META-INF/ 147
2010-11-24 19:42 META-INF/MANIFEST.MF 0
2010-11-24 19:42 com/ 0 2010-11-24 19:42 com/alibaba/ 0
2010-11-24 19:42 com/alibaba/intl/ 0
2010-11-24 19:42 com/alibaba/intl/biz/ 0 2010-11-24 19:42 com/alibaba/intl/biz/company/ 。。。 931 2010-11-24 19:42 com/alibaba/intl/biz/member/api/exception/IllegalRegistInfoException.class 1055 2010-11-24 19:42 com/alibaba/intl/biz/member/api/AccountCoreInfoRemoteServiceContainer.class 2030 2010-11-24 19:42 com/alibaba/intl/biz/AccountCenterServicesLocator.class 467 2010-11-24 19:42 META-INF/INDEX.LIST --------- ------- 43764 51 files

但是如果你用xargs unzip,则会得到如下输出:

【-exec和xargs】-exec和xargs的区别

而使用-exec就没有问题:

【-exec和xargs】-exec和xargs的区别

ls -exec是有问题的,因为ls会将-e作为它的一个选项解释,即:ls -e
xargs的-l选项
用xargs的-l选项,可以达到跟-exec一样的作用:
forrest@ubuntu:~/work_back/intl-standalone/searchaddbuild/deploy/WORLDS-INF/lib$ find -name "*.jar" | xargs -l unzip -l | grep napoli.properties
404 2010-11-16 17:11 META-INF/autoconf/biz-napoli.properties.vm
666 2010-11-27 01:49 biz/napoli.properties
forrest@ubuntu:~/work_back/intl-standalone/searchaddbuild/deploy/WORLDS-INF/lib$ 
另外,xargs也用{}表示当前处理的参数:
forrest@ubuntu:~/work_back/intl-standalone/searchaddbuild/deploy/WORLDS-INF/lib$ ls | xargs -t -I {} mv {} {}.old
mv activation.jar activation.jar.old 
mv activemq-core-5.2.0.jar activemq-core-5.2.0.jar.old 
。。。

           

这一命令序列通过在每个名字结尾添加 .old 来重命名在当前目录里的所有文件。-I 标志告诉 xargs 命令插入有{}(花括号)出现的ls目录列表的每一行。

实战

1. SVN提交代码,如果你用-exec提交每个文件,必然被BS。所以最好是用xargs:
$svn st | grep '^[AMD]' | cut -c9- | xargs svn ci -m 

           

这样只会有一次提交记录。

2. 将lib下面非jar包删除

forrest@ubuntu:~/work_back/intl-standalone/searchaddbuild/deploy/WORLDS-INF/lib$ ls | sed '/.jar/ d' | xargs rm -rf

3. 查找某个文件是否在jar包中
 
            
forrest@ubuntu:~/work_back/intl-standalone/searchaddbuild/deploy/WORLDS-INF/lib$ find -name "*.jar" -exec unzip -l {} /; | grep napoli.properties 404
2010-11-16 17:11 META-INF/autoconf/biz-napoli.properties.vm 666
2010-11-27 01:49 biz/napoli.properties

但是注意到这个结果只能告诉你有这个文件,但是没有告诉你是那个jar包。如果你想知道是哪个jar包,可以用如下命令(这个暴强的命令来自于海锋,我等膜拜):

 
            
forrest@ubuntu:~/work_back/intl-standalone/searchaddbuild/deploy/WORLDS-INF/lib$ find -name "*.jar" -exec sh -c 'unzip -l $1 | xargs printf "$1 %s/n"' {} {} /; | grep napoli.properties
./alibaba-intl-commons-napoli-1.0-Dev.jar META-INF/autoconf/biz-napoli.properties.vm
./alibaba-intl-commons-napoli-1.0-Dev.jar biz/napoli.properties

聪妈提供了一个更简单的命令:

第三种方式——使用单反引号(``)作命令替换command substitution

达到的效果与xargs非常类似,但是xargs有对命令参数作超长检查,而这个不会。所以不建议在这里使用。但是使用``从上一个命令中获取输入结果是非常有用的。

 
            
forrest@ubuntu:~/work_back/intl-standalone/searchaddbuild_trunk/deploy/WORLDS-INF/lib$ unzip -l `find . -name "*.jar"` Archive:
./poi-scratchpad-3.0.jar Length Date Time Name --------- ---------- ----- ---- --------- ------- 0 0
files forrest@ubuntu:~/work_back/intl-standalone/searchaddbuild_trunk/deploy/WORLDS-INF/lib$ for i in `find . -name "*.jar"`; do unzip -l $i | grep napoli.properties; done 404
2010-11-16 17:11 META-INF/autoconf/biz-napoli.properties.vm 705
2010-11-26 20:21 biz/napoli.properties

 原文:http://m.blog.csdn.net/article/details?id=6260720

相关文章:

  • 【root无法删除文件】linux下root不能删除/修改文件权限不够|chattr与lsattr命令详解......
  • 【主机名变bogon】linux主机名被更改为bogon原理分析
  • 【Linux】进程间通信--共享内存
  • 【open stack】openstack从入门到放弃
  • 【防火墙】linux打开防火墙的某几个端口|打开/关闭防火墙centos7
  • 【web.xml】web.xml文件的作用和servlet 、servlet-mapping 标签
  • 【JSON和JSONP】浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
  • 【JSP、servlet、SQL】JSP、servlet、SQL三者之间的数据传递
  • 【Jackson】Jackson和Jackson的用法实例分析
  • 【Spring】Spring 基础,用小例子来理解它(spring boot)
  • 【JQuery】jquery通过ajax方法获取json数据不执行success
  • 【jQuery】jQuery中$.get、$.post、$.getJSON和$.ajax用法的区别
  • 【json序列化】json的序列化、二进制序列化、JSON传输二进制数据方法
  • 【MVC\MVC\MVP】MVC、MVP、MVVM的区别
  • 【三范式】数据库三范式是什么?
  • JS 中的深拷贝与浅拷贝
  • [数据结构]链表的实现在PHP中
  • 《剑指offer》分解让复杂问题更简单
  • 【技术性】Search知识
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Java基本数据类型之Number
  • Mac转Windows的拯救指南
  • pdf文件如何在线转换为jpg图片
  • Redis字符串类型内部编码剖析
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • sublime配置文件
  • vue-cli3搭建项目
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • windows下如何用phpstorm同步测试服务器
  • 诡异!React stopPropagation失灵
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 聚簇索引和非聚簇索引
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 前端性能优化--懒加载和预加载
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何合理的规划jvm性能调优
  • 正则与JS中的正则
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $ git push -u origin master 推送到远程库出错
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (四)模仿学习-完成后台管理页面查询
  • (算法)求1到1亿间的质数或素数
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .htaccess 强制https 单独排除某个目录
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • @Query中countQuery的介绍
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?