代码之家  ›  专栏  ›  技术社区  ›  PKKid

xargs的最佳输出格式

  •  3
  • PKKid  · 技术社区  · 14 年前

    我正在写一个简单的程序来运行在我的系统的不同目录中的一堆文件。它基本上包括打开它们并检查有效的xml。这个程序的一个选项是列出错误的xml文件。

    这就引出了我的问题。为与xargs一起使用而格式化此文件的最佳输出是什么?我认为把每个条目都放在换行符上就足够了,但似乎有点混乱。因为文件名都有空格。

    所以说我的输出是:

    ./dir name 1/file 1.xml
    ./dir name 2/file 2.xml
    ./dir name 3/file 3.xml
    

    我尝试了下面的命令,但它总是说“没有这样的文件或目录”。

    ./myprogram.py --list BADXML | xargs -d '\n' cat
    

    所以…我不是误解了如何使用xargs,就是需要稍微更改程序输出的格式。我不确定最容易使用的)路线在这里。如果我可以避免的话,我不想总是输入一大堆xarg选项。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Valentin Rocher    14 年前

    man xargs

    --零点

    -0输入项以空字符结尾,而不是以 空白,引号和 反斜杠不是特殊的(每个 字是字面意思)。 禁用文件字符串的结尾 像对待任何其他争论一样对待。 当输入项可能包含 空白、引号或 反斜杠。gnu find-print0 选项生成适合于 这种模式。

        2
  •  1
  •   Community rcollyer    7 年前

    您可以丢弃xargs,并使用read:

    ./myprogram.py --list BADXML | while read -a line; do cat "${line[*]}"; done
    

    xargs可以做的任何事情,而read循环可以做得更好……

    后记 按我的 When should xargs be preferred over while-read-loops 问题,答案强调了一个很强的xargs效率的例子,尽管用一些额外的脚本来模拟xargs的参数聚集并不太困难,例如。

    batch10cat () {
        local i=1 argv line
        declare -a argv
        while read -r line; do
            argv[i]="$line"
            let i++
            if test $i -gt 10; then i=1; cat "${argv[@]}"; fi
        done
        if test $i -gt 1; then cat "${argv[@]}"; fi
    }
    ./myprogram.py --list BADXML | batch10 cat
    
        3
  •  0
  •   Ole Tange    14 年前

    与GNU并联 http://www.gnu.org/software/parallel/ 您应该可以在不更改myprogram.py的情况下执行此操作:

    ./myprogram.py --list BADXML | parallel cat
    

    额外的好处:猫将并行运行,因此在多核计算机上可能更快。