【问题标题】:Best output format for XargsXargs 的最佳输出格式
【发布时间】:2011-01-11 08:39:32
【问题描述】:

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

【问题讨论】:

  • touch space\ dir; echo hello > space\ dir/space\ file; echo "space dir/space file" | xargs -d '\n' cat 为我工作

标签: linux bash shell xargs


【解决方案1】:

man xargs

--null

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

【讨论】:

  • 那也不行。好吧,我想我可以空终止我的输出。如果我不使用 xargs,这并不能成为一个非常漂亮的列表。
  • 在您的程序中添加-0 选项。 ./myprogram.py -0 --list BADXML | xargs -0 cat
  • 我已经非常接近了。我添加了一个 -0 选项,它将通过 python 输出 "\0".join(listItems)。我正在运行命令“./myprogram.py -0 --list BADXML | xargs -0 ls -l”。一切正常,除了最后一项报告“没有这样的文件或目录”。如果我将输出 python 行更改为 "\0".join(listItems) + "\0" 以获取最后一项,它适用于最后一项,但我仍然在 "" (空行)。
  • 知道了! -- 打印出 -0 选项时,我需要使用 sys.stdout.write()。使用 print 在所有内容的末尾添加一个换行符。
  • @PKKid,如果你使用 Python,为什么不用 Python 进行格式化。?
【解决方案2】:

你可以抛弃 xargs,使用 read:

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

xargs 可以做的任何事情,while-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】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-10-01
      • 2021-10-03
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 2013-01-19
      相关资源
      最近更新 更多