100개 이상의 하위 폴더( )가 있으며 P_XXX
각 폴더에는 세 개의 파일 세트( 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
세 개의 파일 세트를 기존 하위 폴더 내의 자체 하위 폴더(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%/*}
가장 짧은 접미사 패턴을 제거하고 /*
경로는 상위 디렉토리로 남겨둡니다.