我正在尝试将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个参数
我正在考虑使用以下内容:
find /results/ -type f -name "*Metadata*.xml" -exec
java -jar $SAXON/saxon9he.jar -o:??? {} $WORKDIR/transformXMI.xsl
但这不太有效,因为我不知道如何使输出文件与.xml(扩展名为.csv)具有相同的名称
任何提示?
答案 0 :(得分: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
如果文件名的路径/名称中包含空格,则此简单方法会失败。
答案 1 :(得分:1)
根据文档,字符串{}
将替换为当前文件名带来的处理。这样,除了使用Bash的parameter expansion之外,您还应该能够将输出文件重命名为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
。