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