Xargs的最佳输出格式

时间:2010-01-31 05:58:45

标签: linux bash shell xargs

我正在编写一个简单的程序来运行我系统上各种目录中的一堆文件。它主要涉及打开它们并检查有效的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 个答案:

答案 0 :(得分:2)

man xargs

  

- null

     

-0输入项以空字符而不是由\ n结尾   空白,引号和   反斜杠并不特别(每一个   字面意思是字面意思)。   禁用文件字符串的结尾,即   被视为任何其他参数。   输入项目可能包含时很有用   白色空间,引号或   反斜杠。 GNU查找-print0   选项产生适合的输入   这种模式。

答案 1 :(得分:1)

你可以抛弃xargs,并使用read:

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

xargs可以做任何事情,而读取循环可以做得更好......

Postscript 根据我的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

答案 2 :(得分:0)

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

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

添加了奖励:猫将并行运行,因此可以在多核计算机上更快。