我xmllint
检查文件夹中的所有 XML 文件,如果xmllint
发现无效的 XML 文件,则会输出。
我的问题:如何将此输出写入日志文件?
我在网上找到了这个命令:
find -type f -name "die_xml_datei.xml" -exec xmllint --noout {} \;
以下是我的尝试:
find -type f -name "die_xml_datei.xml" -exec xmllint --output xml_not_valide.txt 2>&1
find -type f -name "die_xml_datei.xml" -exec xmllint --output xml_not_valide.txt {} \;
find -type f -name "die_xml_datei.xml" -exec xmllint --output > xml_not_valide.txt {} \;
答案1
您想要的输出将打印到 stdout。每个都xmllint
将从 继承 stdout find
,因此最简单的方法就是重定向 的 stdout find
:
find -type f -name "*.xml" -exec xmllint --noout {} \; 2>xml_not_valide.txt
但是如果find
将任何内容打印到标准输出,那么它也将被写入文件。
一次可以检查多个文件。通过运行尽可能多的参数来xmllint
减少新进程的数量:xmllint
find -type f -name "*.xml" -exec xmllint --noout {} + 2>xml_not_valide.txt
如果你想从xmllint
进程重定向 stderr,但不想find
从那时你需要运行一个额外的 shell:
: >xml_not_valide.txt
find -type f -name "*.xml" -exec sh -c '
xmllint --noout "$@" 2>>xml_not_valide.txt
' find-sh {} +
注意我使用了>>
因为find -exec sh … +
不能保证只有一个sh
。注意每个重定向都会>
截断文件。我们想在一开始就截断一次,所以我们重定向了 null 命令的输出:
;之后>>
就是要走的路。
如果您需要了解有问题的文件而不需要 的详细输出xmllint
,请使用其退出状态。如果存在问题,该工具将返回非零值,否则返回零值。用作-exec … \;
(否定)测试:
find -type f -name "*.xml" ! -exec xmllint --noout {} \; -print 2>/dev/null >xml_not_valide.txt
仅当! -exec …
成功时(即如果-exec …
失败,即如果xmllint
返回非零),find
才会-print
。它将打印到标准输出。我们使xmllint
打印到标准错误的内容静音并保留find
打印到其标准输出的内容。
您无法使用 执行此操作-exec … +
。这次您必须xmllint
对每个文件运行一次。