重新格式化大量 XML 文件

重新格式化大量 XML 文件

我正在处理分散在嵌套目录结构中的大量 XML 文件。

我尝试了以下方法:

$ find . -name "*.xml" -type f | xargs -- xmllint --format

问题是在屏幕上生成格式化的 XML 输出,但不会更改文件。

如何更改此命令以便更改实际文件内容?

答案1

find这可以通过直接使用来完成-exec

find . -name "*.xml" -type f -exec xmllint --output '{}' --format '{}' \;

传递给的内容-exec将在每个找到的文件中调用一次,并将模板参数{}替换为当前文件名。\;find 命令末尾的 只会终止该行。

xargs在这种情况下,实际上没有必要使用 ,因为我们需要为xmllint每个文件调用一次,因为必须在同一调用中指定输入和输出文件名。

xargs如果从 find 传送到的命令一次处理多个文件并且该列表很长,则需要。在这种情况下您不能这样做,因为您需要将单个文件名传递--outputxmllint.如果不这样做,xargs如果您正在处理大量文件,则可能会出现“参数列表太长”错误。 xargs还支持使用以下-I选项的文件替换字符串:

find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'

会执行与find -exec上面命令相同的操作。如果您的任何文件夹在类似的空格中包含奇数字符,您将需要使用和-0选项。但使用with意味着该选项意味着一次只能处理 1 个文件,因此您也可以直接使用with 。findxargsxargs-I-L 1find-exec

答案2

我通常通过间接层来解决这些问题。编写一个执行您想要的操作的 shell 脚本,然后调用它。我建议作为一个开始

#! /bin/sh
for file
do
   xmllint --format $file > $file.tmp && mv $file.tmp $file
done

手动在一个或两个文件上尝试一下,然后您可以在 xargs 中替换它

find . -name "*.xml" -type f | xargs -- xmltidy.sh

相关内容