Как читать файл из папки, в которой много подпапок [дубликат]

У меня в каталоге данных есть три подкаталога, и каждый подкаталог имеет три разных подкаталога. И мне нужно прочитать два разных файла из последнего подкаталога. Как я могу это сделать?

Я пробовал это, используя приведенный ниже код, и я не могу перемещаться по всем подкаталогам.

cd $datadir

for dirs in *;

    do

    cd $dirs

    
        for folders in *; 

            do 

            echo $folders; 


            file1=$(find "$folders" -name '*regADNI.nii.gz');
            file2=$(find "$folders" -name '*0.25mm-Crop.nii.gz');

            echo $file1
            echo $file2 

            fname=$(echo "$file1" | sed 's|\(.*\)/.*|\1|');
            #echo $fname

            echo "***************"
            
        done

    cd .
    pwd

Ниже приводится организация папок.

enter image description here

Кто-нибудь может мне с этим помочь?

Спасибо, Ананд.

0
задан 14 July 2020 в 23:06

1 ответ

Это немного проще, если вы не пытаетесь сделать это cd . Есть смысл попробовать, но это просто немного запутано, когда вам нужно определить, где вы находитесь в сценарии; все время перемещать каталоги вверх / вниз.

Я бы порекомендовал вместо этого создать пути к файлам, которые вам нужно искать, а затем с помощью найти в этих каталогах без перемещения. Например:


for topDir in $(ls -d ./a*/); do
    for subDir in $(ls -d $topDir*/); do
        for leafDir in $(ls -d $subDir*/); do
            echo "Dir  : $leafDir"
            file1=$(find "$leafDir" -name '1.gz')
            file2=$(find "$leafDir" -name '2.gz')
            echo "Files:" $file1 $file2
        done
    done
done

Приведенный выше скрипт выполняет 3 цикла, создавая каталоги для поиска по спискам только каталогов в каждом предыдущем напрямую. Выполняется в структуре каталогов, приведенной ниже:

justin@mal:~$ tree a
a
├── a
│   ├── a
│   │   ├── 1.gz
│   │   └── 2.gz
│   ├── b
│   │   ├── 1.gz
│   │   └── 2.gz
│   └── c
├── b
│   ├── a
│   │   ├── 1.gz
│   │   └── 2.gz
│   ├── b
│   │   └── 1.gz
│   └── c
│       ├── 1.gz
│       └── 2.gz
└── c
    ├── a
    ├── b
    └── c
        ├── 1.gz
        └── 2.gz

12 directories, 11 files

дает

justin@mal:~$ bash script 
Dir  : ./a/a/a/
Files: ./a/a/a/1.gz ./a/a/a/2.gz
Dir  : ./a/a/b/
Files: ./a/a/b/1.gz ./a/a/b/2.gz
Dir  : ./a/a/c/
Files:
Dir  : ./a/b/a/
Files: ./a/b/a/1.gz ./a/b/a/2.gz
Dir  : ./a/b/b/
Files: ./a/b/b/1.gz
Dir  : ./a/b/c/
Files: ./a/b/c/1.gz ./a/b/c/2.gz
Dir  : ./a/c/a/
Files:
Dir  : ./a/c/b/
Files:
Dir  : ./a/c/c/
Files: ./a/c/c/1.gz ./a/c/c/2.gz

. Вы должны иметь возможность без особых проблем адаптировать ее к конкретному имени каталога верхнего уровня и структурам имен файлов (переключите верхнюю папку a и файл1, имена файла2). Надеюсь, это поможет.

0
ответ дан 30 July 2020 в 22:07

Другие вопросы по тегам:

Похожие вопросы: