我正在尝试编写一个脚本,在远程服务器上的 Jenkins 下运行,以运行我们的系统。系统可以导入不同格式的文件,这些文件通过扩展名进行区分。我们有各种格式的测试数据,位于 的子目录中,resources
因此我们有
resources/datasetA/datasetA.format1
resources/datasetB/datasetB.format1
resources/datasetC/datasetC.format2
etc.
一般来说,数据集目录和附加子目录中还有其他文件。
我正在尝试挑选导入源文件 - 上面列出的文件 - 但没有运气。
我最初的想法是
for dir in $(ls -d resources/*/)
do
dataset=$(echo ${dir%/} | xargs basename)
source=$(ls resources/$dataset/$dataset.*)
.
.
.
done
当我将其输入到本地计算机上的 cygwin 窗口中时,这工作正常,但在远程计算机上失败,其中ls resources/$dataset/$dataset.*
似乎返回多个文件。本地和远程计算机上的目录内容是相同的,我不明白为什么会发生这种情况。
然后,我尝试列出 resources/$dataset 中的所有文件,并确定最后一个基本名称较少的扩展名与 $dataset 匹配的文件,例如
for dir in $(ls -d resources/*/)
do
dataset=$(echo ${dir%/} | xargs basename)
find resources/$dataset -maxdepth 1 -type f | while read fnm
do
baseFnm=$(basename $fnm)
if [ ${baseFnm%.*} = $dataset ]
then
source=$fnm
fi
done
# Exercise the system using $source
done
但当source
我尝试使用它时它是空的。我对此感到非常困惑,因为我可以在if
结构中添加跟踪并看到测试是否成功。
没有什么可畏惧的,如果测试成功,我尝试跳出循环,但在这种情况下fnm
是空的。
帮助!
答案1
一般来说,尝试解析 的输出是一个坏主意ls
。
也许以下内容会有帮助?
for d in resources/*/
do
rn=${d%/};rn=${rn##*/}
for f in "$d$rn."*
do
[ -f "$f" ] && printf '%s\n' "$f"
done
done
您提到您正在使用詹金斯和远程机器。您的问题最可能的原因是缺少引用,尤其是美元符号。你如何调用这个脚本?