私はディレクトリでファイルを見つけ、ifステートメントを介してファイルを紹介するスクリプトを作成しました。コードは次のとおりです。
for dirname in /input/*; do
id=${dirname#/input/} # remove "/input/sub-"
id=${id%/} # remove trailing "/"
printf 'Adding ID to recon-all processing list: %s\n' "${id}" >&2
T11=`find /input/${id}/unprocessed/3T -name "*T1*MPR1*" -type f`
T12=`find /input/${id}/unprocessed/3T -name "*T1*MPR2*" -type f`
T21=`find /input/${id}/unprocessed/3T -name "*T2*SPC1*" -type f`
T22=`find /input/${id}/unprocessed/3T -name "*T2*SPC2*" -type f`
if [ -z "$T11" ] || [ -z "$T12" ] || [ -z "$T21" ] || [ -z "$T22" ]; then
recon-all -s "${id}" -i "${T11}" -i "${T12}" -i "${T21}" -i "${T22}"
elif [ -z "$T11" ] || [ -z "$T12" ] || [ -z "$T21" ]; then
recon-all -s "${id}" -i "${T11}" -i "${T12}" -i "${T21}"
elif [ -z "$T11" ] || [ -z "$T12" ] || [ -z "$T22" ]; then
recon-all -s "${id}" -i "${T11}" -i "${T12}" -i "${T22}"
elif [ -z "$T11" ] || [ -z "$T21" ]; then
recon-all -s "${id}" -i "${T11}" -i "${T21}"
elif [ -z "$T11" ] || [ -z "$T22" ]; then
recon-all -s "${id}" -i "${T11}" -i "${T22}"
else
recon-all -s "${id}" -i "${T11}" -i "${T21}"
fi
if [ -e "/output/$subj_id" ]; then
# no output file corresponding to this ID found,
# add it to he list
all_ids+=( "$subj_id" )
fi
done
問題は、ディレクトリ内にさまざまな組み合わせがあり、時にはT12とT22が欠落している可能性があることです。これがrecon-all
各ドアごとに1つずつ作成された理由です。 if文を単純化してこのスクリプトを並列化するにはどうすればよいですか?
答え1
recon-all
電話したいかと思います。null以外のすべての変数。この場合、次のことができます。
opts=( -s "$id" )
for val in "$T11" "$T12" "$T21" "$T22"; do
[[ -n "$val" ]] && opts+=( -i "$val" )
done
recon-all "${opts[@]}"