複数のサブフォルダがある場合は、ファイル名に基づいてファイルをサブフォルダに移動します。

複数のサブフォルダがある場合は、ファイル名に基づいてファイルをサブフォルダに移動します。

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%/*}最も短いサフィックスパターンを削除し、パスは親ディレクトリ/*のままにします。

おすすめ記事