免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1536 | 回复: 0
打印 上一主题 下一主题

find的exec参数与xargs命令的区别 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-25 12:26 |只看该作者 |倒序浏览

给大家推荐一个学习Linux的微信公众账号,他们都每天都会推送一些学习Linux相关的技术知识,还有在他们的微信对话框里也可以输入linux命令。大家去试试吧
在微信添加好友里面搜索:xuelinux
这些资料就是他们推送的,我转发给大家。

当要删除目录下所有文件:
$find . -name 'core' -type f -exec rm {} /;
也可以
$find . -name 'core' -type f | xargs rm
这两个有什么区别呢?
第一种,-exec,相当于把前面find的结果替换到{} /;的位置去进行rm操作。
第二种,|xargs 是相当于把管道前面的find结果替换到管道后面的末尾(默认是末尾)去执行rm操作。
-exec的方式只开启了一个rm进程去删除文件,而xargs因为是分批处理,所以会开启多个进程处理,效率自然稍微低一点,但为什么有时候还要用它呢?
因为一次性替换find到的结果,如果结果过多,会出现参数过长的错误,这时候就需要用到xargs来分批处理了。
前面说过,xargs会把管道前面的结果替换到管道后面的末尾,那么如果不想替换到末尾怎么办呢?比如mv命令批量改名
$touch 1 2 3
$find . -type f -exec mv {} {}.bak \;
$ls
1.bak 2.bak  3.bak
$rm -f *
$touch 1 2 3
$find . -type f|xargs -i mv {} {}.bak
$ls
1.bak 2.bak  3.bak
$find . -type f|xargs -I [] mv [] [].tmp
$ls
1.bak.tmp 2.bak.tmp  3.bak.tmp

怎么才能知道系统最大支持多少个命令参数呢?
$getconf ARG_MAX
2621440
就是说,如果在我的系统find结果不超过2621440个文件的话,就不用担心参数超长问题了。

另外一点区别:
比如我想在搜索到的文件里查询是否有abc这个内容:
$cat 1.tmp
abc
$cat 2.tmp
$find . -type f -exec grep abc {} \;
abc
$find . -type f |xargs grep abc
./1.tmp:abc
前者虽然能查到有abc的行,但不知道属于哪个文件,而后者不但输出了匹配的行,还输出了匹配行所属的文件名称,一目了然。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP