2013-05-02 49 views
0

我试图将一个windows批处理文件移植到linux shell脚本(bash)中。Linux shell脚本 - 找到所有文件并在其中的每一个上运行命令

这里是让我头疼的一些部分:

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

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

  • -o是输出文件(这将是具有相同名称的.csv作为.XML)
  • 下是目标文件
  • 最后一个参数是所述的.xsl文件

我想使用的以下内容:

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

但这完全不是那么回事,因为我不知道如何使出来put文件与.xml具有相同的名称(扩展名为.csv)

任何提示?

+0

与XSL的名字相同吗?你是不是指与XML相同的名称? – voithos 2013-05-02 15:29:02

+0

正确,意思是xml – 2013-05-02 15:29:37

回答

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 

这个简单的方法的情况下,文件名有自己的路径/名称空间将失败。

+0

几乎在那里。输出文件被称为 .xml.out(我用csv代替out,但它仍然是一个问题。)。尽管如此,我应该可以从这里解决这个问题。谢谢! – 2013-05-02 15:45:03

+0

我更新了基于@voithos输入的答案。现在xml被替换为csv。 – harpun 2013-05-02 15:48:35

+1

我想我比这个方法更好地执行每个文件的bash shell。 – voithos 2013-05-02 15:49:34

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创建壳参数。 fname="{}"使用当前XML文件的内容创建一个新的shell参数。完成之后,可以使用参数扩展:${fname%.xml}扩展名的条带,然后用.csv替换。

相关问题