하위 폴더가 여러 개인 경우 파일 이름을 기준으로 파일을 하위 폴더로 이동하세요.

하위 폴더가 여러 개인 경우 파일 이름을 기준으로 파일을 하위 폴더로 이동하세요.

100개 이상의 하위 폴더( )가 있으며 P_XXX각 폴더에는 세 개의 파일 세트( run1, run2run3)가 포함되어 있습니다.

/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

세 개의 파일 세트를 기존 하위 폴더 내의 자체 하위 폴더(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 하위 폴더를 세 개의 다른 하위 폴더(run1, run2, run3)와 일치하는 파일로 동시에 재구성하려면 어떻게 해야 합니까?

답변1

두 개의 루프를 사용할 수 있습니다 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%/*}가장 짧은 접미사 패턴을 제거하고 /*경로는 상위 디렉토리로 남겨둡니다.

관련 정보