如何将 xmllint 的输出写入日志文件?

如何将 xmllint 的输出写入日志文件?

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对每个文件运行一次。

相关内容