HPCの複数のサブディレクトリを介して順次ループを実行する

HPCの複数のサブディレクトリを介して順次ループを実行する

私はこれが重複した質問であることを知っていますが、私が見た提案のどれも私が望むことをしません。

スループットの高いデータに対してさまざまなタスクを実行するために、さまざまなモジュールを備えた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"この方法は機能しますが、{ }一貫性のためにドットを維持しました。

関連情報