如何找到名称(几乎)与其包含目录匹配的文件

如何找到名称(几乎)与其包含目录匹配的文件

我正在尝试编写一个脚本,在远程服务器上的 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

您提到您正在使用詹金斯和远程机器。您的问题最可能的原因是缺少引用,尤其是美元符号。你如何调用这个脚本?

相关内容