2016-04-29 3 views
1

Я новичок в кодировании и пытаюсь выполнить итерацию по папкам, чтобы найти конкретный файл (называемый одним и тем же в каждой папке). У меня есть 3 папки (CONTROL, GROUP1 и GROUP2). Каждая папка имеет 2 подпапки в ней из названий папок (2 3 4 5 6 7. Каждая подпапка имеет в ней файл с именем подпапки, таким как 2_diff.nii или 3_diff.nii. Я хотел бы, чтобы код включался в каждый папка, найти вложенные папки и затем выполнить анализ файла там. Проблема в том, что мой код, похоже, ищет каждую подпапку в каждой основной папке, и каждая основная папка имеет только 2 подпапки из (2 3 4 5 6 7) Любые советы будут с благодарностью. - спасибо !!Итерация через папки для определенных файлов в BASH

Folders=(CONTROL GROUP1 GROUP2) 
SubFolders=(2 3 4 5 6 7) 

data_source=/Users/sheena/Desktop/test/ 

for j in ${Folders[@]}; do 
    cd ${data_source}/${j}/ 
    for i in ${SubFolders[@]}; do 
    fslroi ${i}_diff.nii ${i}_nodif 0 1 #I want to analyze the file <subfolder>_diff.nii and name the output as <subfolder>_nodif.nii 
    done 
done 

ответ

0

Я так понимаю ваш вопрос в том, что в каждом из каталогов CONTROL, GROUP1 и GROUP1 есть 2 файлов вида x_diff.nii где x - это цифра от 2 до 7. По крайней мере, так Я прочитал ваш код.

Вы не знаете заранее, какие две цифры есть.

Самый простой способ я вижу это пробежать все возможные SubFolders, как вы это делаете, но использовать continue заявление рано, чтобы перейти к следующему, если он не существует:

Folders=(CONTROL GROUP1 GROUP2) 
SubFolders=(2 3 4 5 6 7) 

data_source=/Users/sheena/Desktop/test/ 

for j in ${Folders[@]}; do 
    cd ${data_source}/${j}/ 
    for i in ${SubFolders[@]}; do 
    if [[ ! -e ${i}_diff.nii ]]; then 
     continue 
    fi 
    fslroi ${i}_diff.nii ${i}_nodif 0 1 
    done 
done 

Вы могли бы заменить if пункт выше с одной строкой:

for i in ${SubFolders[@]}; do 
    [[ -e ${i}_diff.nii ]] || continue 
    fslroi ${i}_diff.nii ${i}_nodif 0 1 
    done 

Но я нахожу более выразительным if - fi блок легче читать и понимать, и это тоже важно.

+0

Здравствуйте, большое спасибо за ваш ответ. Я не был знаком с командой continue, но она отлично работала! – Sheenas

+0

Теперь, когда я смотрю на него, я задаюсь вопросом, почему я не сделал очевидного и поместил командную строку 'fslroi' в блок' if'. Тогда мне не понадобилось бы «продолжить». В любом случае, если он работает, он работает. – chw21