名前を含むディレクトリとほぼ一致するファイルを見つける方法

名前を含むディレクトリとほぼ一致するファイルを見つける方法

システムを実行するためにリモートサーバーの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

Jenkinsとリモートシステムを使用していると言われました。問題の主な原因は、引用符、特にドル記号が欠落しているためです。このスクリプトをどのように呼び出しますか?

関連情報