【问题标题】:Format all XML files in a directory and save them in a subdirectory格式化一个目录中的所有 XML 文件,并将它们保存在一个子目录中
【发布时间】:2014-01-01 20:28:02
【问题描述】:

我正在尝试编写一个脚本,该脚本将浏览一个目录,找到所有 XML 文件,通过xmllint 运行它们,并将格式化的结果保存到名为formatted 的子目录中的同名文件中.这是我到目前为止的脚本:

find . -maxdepth 1 -type f -iname "*.xml" | xargs -I '{}' xmllint --format '{}' > formatted/'{}'

这在一定程度上有效。子目录以一个名为"{}" 的文件结束,这只是通过xmllint 处理的最终文件的结果。如何让文件正确写入子目录?

【问题讨论】:

    标签: bash find xargs xmllint


    【解决方案1】:

    您看到的名为{} 的文件可能应该包含所有 格式的文件。原因是您使用的重定向实际上并不是xargs 看到的命令的一部分。重定向由 shell 解释,所以它的作用是运行

    find . -maxdepth 1 -type f -iname "*.xml" | xargs -I '{}' xmllint --format '{}'
    

    并将输出保存到名为 formatted/{} 的文件中。

    尝试使用xmllint--output 选项而不是重定向:

    ... | xargs -I '{}' xmllint --format '{}' --output formatted/'{}'
    

    您还可以通过使用find-exec 选项来避免调用xargs

    find . -maxdepth 1 -type f -iname "*.xml" -exec xmllint --format '{}' --output formatted/'{}' \;
    

    【讨论】:

    • 谢谢,不知道 xmllint 的 --output 选项。我测试了这两种解决方案(使用xargs-exec),它们都运行良好。有趣的是,find 手册页提到当您使用-exec 时,“命令中只允许使用'{}' 的一个实例”,这就是我最初选择xargs 的原因,但它工作得很好。
    • @Ben 在我的手册页版本中,该短语用于-exec command {} + 语法,但这里使用了-exec command ; 语法,在手册页的上面几行中对此进行了描述。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多