![重新格式化大量 XML 文件](https://linux22.com/image/26201/%E9%87%8D%E6%96%B0%E6%A0%BC%E5%BC%8F%E5%8C%96%E5%A4%A7%E9%87%8F%20XML%20%E6%96%87%E4%BB%B6.png)
我正在处理分散在嵌套目录结构中的大量 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 传送到的命令一次处理多个文件并且该列表很长,则需要。在这种情况下您不能这样做,因为您需要将单个文件名传递--output
给xmllint
.如果不这样做,xargs
如果您正在处理大量文件,则可能会出现“参数列表太长”错误。 xargs
还支持使用以下-I
选项的文件替换字符串:
find . -name "*.xml" -type f | xargs -I'{}' xmllint --output '{}' --format '{}'
会执行与find -exec
上面命令相同的操作。如果您的任何文件夹在类似的空格中包含奇数字符,您将需要使用和-0
选项。但使用with意味着该选项意味着一次只能处理 1 个文件,因此您也可以直接使用with 。find
xargs
xargs
-I
-L 1
find
-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