代码之家  ›  专栏  ›  技术社区  ›  Charles Stewart

什么时候xargs应该优先于while read循环?

  •  19
  • Charles Stewart  · 技术社区  · 16 年前

    xargs while read -r; do ... done while read -ar; do ... done 循环。

    什么时候应该 参数代换 什么时候应该首选while read循环?

    6 回复  |  直到 16 年前
        1
  •  31
  •   paxdiablo    16 年前

    那件事 while 循环是指它们倾向于一次处理一个项目,通常是在不必要的时候。这就是 xargs 有一个优点-它可以成批处理参数,使一个命令可以处理许多项。

    例如,while循环:

    pax> echo '1
    2
    3 
    4
    5' | while read -r; do echo $REPLY; done
    1
    2
    3
    4
    5
    

    以及相应的 参数代换 :

    pax> echo '1
    2
    3 
    4
    5' | xargs echo
    1 2 3 4 5
    

    虽然 参数代换 . 换句话说,前者相当于 echo 1 ; echo 2 ; echo 3 ; echo 4 ; echo 5 echo 1 2 3 4 5

    当使用可以接受多个参数的命令时,这是最有利的,因为它减少了启动的单个进程的数量,使事情变得更快。

    ),我将使用 变体。

    如果我对性能感兴趣(大文件),我会使用 参数代换

        2
  •  6
  •   ndim    16 年前

    的一些实现 xargs 也了解 -P MAX-PROCS 参数代换 while read

        3
  •  6
  •   Ole Tange    11 年前

    GNU并行 http://www.gnu.org/software/parallel/ 具有以下优点 xargs while-read 使用换行符作为分隔符和一些新功能(例如输出分组、远程计算机上作业的并行运行和上下文替换)。

    如果你有GNU并行安装,我看不到一个单一的情况下,你会使用 . 在这种情况下 read-while 如果要执行的块太大,无法放入一行(例如,如果它包含if语句或类似语句),并且您拒绝生成bash函数。

    echo '1
    2
    3 
    4
    5' | parallel -m echo
    

    使用GNU Parallel将WAV文件转换为MP3:

    find sounddir -type f -name '*.wav' | parallel -j+0 lame {} -o {.}.mp3
    

    观看GNU Parallel的简介视频: http://www.youtube.com/watch?v=OpaiGYxkSuQ

        4
  •  5
  •   ony    16 年前

    “xargs”有选项“-n max args”,我想这将允许一次调用多个参数的命令(对于“grep”、“rm”和更多类似的程序很有用) 试用手册页中的示例:

    cut -d: -f1 < /etc/passwd | sort | xargs -n 5 echo
    

    你会看到它“回声”-每行5个用户

    别忘了“xargs”是一个程序(就像subshell)。因此,无法以简单的方式将信息获取到shell脚本中(您需要读取“xargs”的输出并以某种方式进行解释以填充shell/env变量)。

        5
  •  2
  •   Andrey Taranov    11 年前

    相反,有些情况下,您有一个文件列表,每行1个,包含空格。例如,来自 find pkgutil 或者类似的。与…共事 xargs 你必须用引号将行括起来 sed 首先,这看起来很笨拙。

    找到

    function process {
      while read line; do
        test -d "$line" && echo "$line"
      done
    }
    
    find . -name "*foo*" | process
    
        6
  •  1
  •   I don't know    11 年前

    我不明白,人们总是抱怨while必须在循环中执行,而不是在循环外执行。我对linux知之甚少,但我知道使用MS-DOS的变量建立参数列表相当简单,或者>文件,cmd<文件来建立一个参数列表,如果您超过了行长度限制。

    还是有人说linux不如ms dos好(见鬼,我知道你可以构建链,因为很多bash脚本显然都在这么做,只是不在循环中)。

    最后,xargs更适用于内联命令,其速度优势是可以忽略的(编译/解释的字符串构建之间的差异),因为它所做的一切都可以通过shell脚本来完成。

    推荐文章