0

我正在尝试将 Windows 批处理文件移植到 linux shell 脚本(bash)。

这是让我有些头疼的部分:

for /r %%G in (*Metadata*.xml) DO (
java -jar %SAXON%\saxon9he.jar -o:%%~nG.csv "%%G" %WORKDIR%\transformBQT.xsl)

这样做是找到所有包含文本元数据的 .xml 文件,然后对这些文件中的每一个运行 XSLT 转换。这需要 3 个参数

  • -o 是输出文件(这将是一个与 .xml 同名的 .csv)
  • 接下来是目标文件
  • 最后一个参数是 .xsl 文件

我正在考虑使用以下内容:

find /results/ -type f -name "*Metadata*.xml" -exec 
java -jar $SAXON/saxon9he.jar -o:??? {} $WORKDIR/transformXMI.xsl

但这并不完全有效,因为我不知道如何使输出文件具有与 .xml 相同的名称(扩展名为 .csv)

有小费吗?

4

2 回答 2

4

您可以find逐行处理结果并转换<file>.xml<file>.csv

find /results/ -type f -name "*Metadata*.xml" | while read file; do java -jar $SAXON/saxon9h3.jar -o:${file%.xml}.csv $file $WORKDIR/transform.XMI.xsl; done

如果文件名的路径/名称中有空格,这种简单的方法就会失败。

于 2013-05-02T15:33:53.493 回答
1

根据文档,字符串{}被替换为处理的当前文件名。这样,连同使用 Bash 的参数扩展,您应该能够将输出文件重命名为 CSV。

find /results/ -type f -name "*Metadata*.xml" -exec 
bash -c 'fname="{}"; java -jar $SAXON/saxon9he.jar -o:"${fname%.xml}.csv" "$fname" $WORKDIR/transformXMI.xsl' \;

这里重要的一点是您在执行 Bash 时创建的 shell 参数。fname="{}"使用当前 XML 文件的内容创建一个新的 shell 参数。之后,您可以使用参数扩展:扩展${fname%.xml}的条带,.xml然后将其替换为.csv.

于 2013-05-02T15:41:28.233 回答