Linux shell脚本 - 查找所有文件并在每个文件上运行命令

时间:2013-05-02 15:23:38

标签: linux bash shell

我正在尝试将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)
  • next是目标文件
  • 最终参数是.xsl文件

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

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

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

任何提示?

2 个答案:

答案 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