100以上のサブフォルダ()があり、P_XXX
各フォルダには3つのファイルセット(run1
、、run2
およびrun3
)が含まれています。
/Analysis
/P_076
/run1
/run2
/run3
swu_run1_P_076_vol_001.nii
swu_run1_P_076_vol_002.nii
swu_run2_P_076_vol_001.nii
swu_run2_P_076_vol_002.nii
swu_run3_P_076_vol_001.nii
swu_run3_P_076_vol_002.nii
/P_102
/run1
/run2
/run3
swu_run1_P_102_vol_001.nii
swu_run1_P_102_vol_002.nii
swu_run2_P_102_vol_001.nii
swu_run2_P_102_vol_002.nii
swu_run3_P_102_vol_001.nii
swu_run3_P_102_vol_002.nii
3つのファイルセットを既存のサブフォルダ内の独自のサブフォルダ(run1、run2、およびrun3)に移動したいと思います。
/Analysis
/P_076
/run1
swu_run1_P_076_vol_001.nii
swu_run1_P_076_vol_002.nii
/run2
swu_run2_P_076_vol_001.nii
swu_run2_P_076_vol_002.nii
/run3
swu_run3_P_076_vol_001.nii
swu_run3_P_076_vol_002.nii
/P_102
/run1
swu_run1_P_102_vol_001.nii
swu_run1_P_102_vol_002.nii
/run2
swu_run2_P_102_vol_001.nii
swu_run2_P_102_vol_002.nii
/run3
swu_run3_P_102_vol_001.nii
swu_run3_P_102_vol_002.nii
サブフォルダ(P_XXX)からスクリプトを実行すると、次のコードが機能します。
for f in swu_run?_*.nii; do
num=${f:7:1}
mv "$f" run"$num"/
done'
for
しかし、各サブフォルダで手動で実行するのではなく、親ディレクトリ(分析)で機能する適切なループを見つけるのが困難です。私は以下を試しました:
find . -type f -name '*.nii' -exec bash -c '
for f in swu_run?_*.nii; do
num=${f:7:1}
mv "$f" run"$num"/
done' bash {} +
エラーメッセージが返されます。cannot stat 'swu_run?_*.nii': No such file or directory.
分析フォルダレベルでコードを実行して、各P_XXXサブフォルダを3つの異なるサブフォルダ(run1、run2、run3)と一致するファイルに同時に再構成するにはどうすればよいですか。
答え1
2つのループを使用できますbash
。
cd /path/to/Analysis
shopt -s nullglob
for i in {1..3}; do
for f in */swu_run${i}_*.nii; do
mv "$f" "${f%/*}/run${i}/"
done
done
有効なnullglob
シェルオプションを使用すると、一致*/swu_run${i}_*.nii
するファイル(移動または欠落)がない場合、内部ループは入力されません。
パラメータ拡張は${f%/*}
最も短いサフィックスパターンを削除し、パスは親ディレクトリ/*
のままにします。