3

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

4

3 回答 3

2

man xargs

- 无效的

-0 输入项以空字符而不是空格结尾,并且引号和反斜杠不是特殊的(每个字符都按字面意思表示)。禁用文件字符串的结尾,它被视为任何其他参数。当输入项可能包含空格、引号或反斜杠时很有用。GNU find -print0 选项产生适合这种模式的输入。

于 2010-01-31T06:02:16.803 回答
1

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

./myprogram.py --list BADXML | 同时读取-一行;做猫“${line[*]}”;完毕

xargs 可以做的任何事情,while-read 循环都可以做得更好......

后记根据我的何时 xargs 应该优先于 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
于 2010-01-31T19:42:30.073 回答
0

使用 GNU Parallel http://www.gnu.org/software/parallel/你应该能够在不改变 myprogram.py 的情况下做到这一点:

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

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

于 2010-06-10T19:43:51.287 回答