私はこれが重複した質問であることを知っていますが、私が見た提案のどれも私が望むことをしません。
スループットの高いデータに対してさまざまなタスクを実行するために、さまざまなモジュールを備えたHPCクラスタを使用しています。以前は、次のコードを使用してディレクトリ内の一連のファイルに対して操作を実行していました。
#!/bin/bash
module load random_module
fqFiles=`find $1 -name '*.nii' -type f`
for fqFile in $fqFiles;do
some random action
done
しかし、より多くのファイルに関連するより複雑なタスクを実行し、複数のサブフォルダで実行したいと思います。
各サブフォルダには、異なるIDを持つ異なるサンプルに属し、サンプルID(サンプル名によって変更されます)を反映する複数のファイルが含まれています。
各サブフォルダ内で実行する必要がある操作は次のとおりです。
eddy --main=ID.nii \
--mask=ID_mask.nii \
--index=ID_index.txt \
--acqp=ID_acqp.txt \
--bvecs=ID.bvec \
--bvals=ID.bval \
--fwhm=0 \
--flm=quadratic \
--out=eddy_out \
--data_is_shelled
ここで、「ID」は分析するサンプルのIDに応じて変わります。サブフォルダ「specimen1」には、次のように名前が付けられ、分析する50個のサンプルすべてに同じファイル、、specimen1.nii
などspecimen1_mask.nii
が含まれています。specimen1_index.txt
問題は、すべてのサンプルの名前が「Mike」、「Charles」、「Anita」などのように互いに異なるため、連続的または数字ではないことです。
サブフォルダー名とファイル接頭辞が異なりますが、あるフォルダーで操作を実行した後、次のフォルダーに移動して、次のサブフォルダーで同じ操作を実行するスクリプトでそれをラップするのに役立つ人はいますか?
とても感謝しています!
答え1
あなたの追加情報に基づいて、次の解決策であると確信しています。
for SPEC in *
do
cd "$SPEC"
eddy --main="${SPEC}.nii" \
--mask="${SPEC}_mask.nii" \
--index="${SPEC}_index.txt" \
--acqp="${SPEC}_acqp.txt" \
--bvecs="${SPEC}.bvec" \
--bvals="${SPEC}.bval" \
--fwhm=0 --flm=quadratic --out=eddy_out --data_is_shelled
cd ..
done
議論する
あなたのIDを「sample」のSPECに置き換えました(必要に応じて呼び出すこともできます)。すべてのサンプルサブディレクトリのリストを作成し、それを*
順番にfor
変数に割り当てるループを繰り返します。SPEC
ディレクトリ名には、シェルで解釈できる興味深い文字を含めることができるため、ペアへの参照はすべて二重引用符で囲みSPEC
ます。これは、USD以外の特殊文字の解釈を削除します。
したがって、各ディレクトリに対してSPEC
サブディレクトリに移動してコマンドを実行し、eddy
親ディレクトリに戻ります。などの下線が変数名の一部として解釈される{SPEC}
ため、この方法で作成されます。SPEC_mask
変数名にはドットを含めることができないため、"$SPEC.nii"
この方法は機能しますが、{ }
一貫性のためにドットを維持しました。