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

Linux shell脚本-查找所有文件并对每个文件运行命令,linux,bash,shell,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) 这样做的目的是找到包含文本元数据的all.xml文件,然后在每个文件上运行XSLT转换。这需要3个参数 -o是输出文件(这将是一个与.xml同名的.csv) 接下

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

以下是让我头疼的部分:

for /r %%G in (*Metadata*.xml) DO (
java -jar %SAXON%\saxon9he.jar -o:%%~nG.csv "%%G" %WORKDIR%\transformBQT.xsl)
这样做的目的是找到包含文本元数据的all.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)


任何提示?

您可以逐行处理
查找
的结果,并将
.xml
转换为
.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

如果文件名的路径/名称中有空格,此简单方法将失败。

您可以逐行处理
查找
的结果,并将
.xml
转换为
.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

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

根据文档,字符串
{}
将替换为当前文件名。这样,在使用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

对于文档,字符串
{}
将替换为当前文件名。这样,在使用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
条带,然后将其替换为与XSL同名的
.csv

?您的意思是与XML同名吗?与XSL同名吗?你的意思是和XML同名吗?差不多了。输出文件名为.xml.out(我使用csv而不是out,但仍然是同一个问题)。不过我应该能从这里解决这个问题。谢谢我根据@voithos输入更新了答案。现在xml被csv取代了。我想我更喜欢这种方法,而不是对每个文件执行bash shell。好的,我尝试了许多变体,但我无法实现。在以下命令中:
java-jar$SAXON/saxon9he.jar-o:${file%.xml}.csv$file$WORKDIR/transformXMI.xsl;完成
输出文件
${file%.xml}.csv
在与
$文件
相同的文件夹中生成。如何确保在执行脚本的当前文件夹中创建输出文件?如果我使用固定输出文件(比如。
out.csv
),它确实会在当前文件夹中创建!好的,分类!我所要做的就是几乎在那里使用
basename
。输出文件名为.xml.out(我使用csv而不是out,但仍然是同一个问题)。不过我应该能从这里解决这个问题。谢谢我根据@voithos输入更新了答案。现在xml被csv取代了。我想我更喜欢这种方法,而不是对每个文件执行bash shell。好的,我尝试了许多变体,但我无法实现。在以下命令中:
java-jar$SAXON/saxon9he.jar-o:${file%.xml}.csv$file$WORKDIR/transformXMI.xsl;完成
输出文件
${file%.xml}.csv
在与
$文件
相同的文件夹中生成。如何确保在执行脚本的当前文件夹中创建输出文件?如果我使用固定输出文件(比如。
out.csv
),它确实会在当前文件夹中创建!好的,分类!我所要做的就是使用
basename