我正在编写一个简单的程序来运行我系统上各种目录中的一堆文件。它主要涉及打开它们并检查有效的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选项。
答案 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
添加了奖励:猫将并行运行,因此可以在多核计算机上更快。