zoukankan      html  css  js  c++  java
  • xargs与exec区别

     平时使用find命令查找出文件的时候有时候后面有时候用-exec有时候用管道加xargs,这2个到底有什么不同?下面就这2个的不同做简单介绍。

    零、实验环境

    [root@osker /]# find /root/ -type f -name '*.txt'
    /root/1.txt
    /root/2.txt
    /root/3.tx



    一、xargs的使用

    (1)将前一个命令的标准输出传递给下一个命令,作为它的参数,xargs的默认命令是echo,空格是默认定界符
    (2)将多行输入转换为单行

    [root@osker /]# find /root/ -type f -name '*.txt'|xargs
    /root/1.txt /root/2.txt /root/3.txt
    [root@osker /]# find /root/ -type f -name '*.txt'|xargs echo start
    start /root/1.txt /root/2.txt /root/3.txt
    ###-i:逐项处理,默认以空格为分隔符;{}表示前面传过来的结果。
    [root@osker /]# find /root/ -type f -name '*.txt'|xargs -i mv {} {}.bak
    [root@osker /]# ll /root/
    total 0
    -rw-r--r--. 1 root root 0 Apr 16 21:35 1.txt.bak
    -rw-r--r--. 1 root root 0 Apr 16 21:35 2.txt.bak
    -rw-r--r--. 1 root root 0 Apr 16 21:35 3.txt.bak
    
    ###-n: 指定一次处理的参数个数
    [root@osker /]# find /root/ -type f -name '*.bak'|xargs -n 2
    /root/1.txt.bak /root/2.txt.bak
    /root/3.txt.bak

    注意:处理特殊文件名需要采用-0来避免特殊字符(xargs -0 )

    二、exec的使用

    exec参数是一个一个传递的,传递一个参数执行一次命令。
    -exec 命令 {} ;
    “{}”表示命令的参数即为所找到的文件;以“;”表示命令的结束,“”是转义符,因为分号在命令中还有它用途,所以就用一个来限定表示这是一个分号而不是表示其它意思。
    PS:-ok和-exec的作用相同,格式也一样,只不过以一种更为安全的模式来执行该参数,在给出的shell运行这个命令之前,都会给出提示,让用户来确定是否执行。

    [root@osker /]# find /root/ -type f -name '*.bak' -ok echo start {} ;
    < echo ... /root/1.txt.bak > ? y
    start /root/1.txt.bak
    < echo ... /root/2.txt.bak > ? y
    start /root/2.txt.bak
    < echo ... /root/3.txt.bak > ? y
    start /root/3.txt.bak
    
    [root@osker /]# find /root/ -type f -name '*.txt' -exec echo start {} ;
    start /root/1.txt
    start /root/2.txt
    start /root/3.txt

    该处理过程为:find命令查找到第一个文件传给echo处理,然后将查找到的第二个文件传给echo处理....


    三、2个命令在处理的流程上不一样所以在处理效率上也不同

    [root@nfs ~]# touch {1..10000}.txt
    [root@nfs ~]# time find ./ -type f -name '*.txt' |xargs rm -f
    real    0m0.203s
    user    0m0.016s
    sys    0m0.186s
    [root@nfs ~]# touch {1..10000}.txt
    [root@nfs ~]# time find ./ -type f -name '*.txt' -exec rm {} ;
    real    0m8.074s
    user    0m3.717s
    sys    0m4.294s

    可以看到xargs在处理大量文件上时间比exec短。




    总结:xargs一次将参数传给命令,可以使用-n控制参数个数;exec参数是一个一个传递的,传递一个参数执行一次命令。

  • 相关阅读:
    内存映射文件原理探索(转载)
    虚拟内存原理
    CSAPP-链接
    CSAPP-程序优化
    CSAPP-过程调用,数据存储,缓冲区溢出
    【数学,方差运用,暴力求解】hdu-5037 Galaxy (2014鞍山现场)
    【贪心+一点小思路】Zoj
    【几何模板加点小思路】hdu-4998 Rotate
    【背包问题】【出来混总是要还的...】总结+入门练手题
    【优先队列】【最近连STL都写不出来了/(ㄒoㄒ)/~~】hdu_5360/多校#6_1008
  • 原文地址:https://www.cnblogs.com/osker/p/12716383.html
Copyright © 2011-2022 走看看