Повторите функцию через каждую подпапку

#bash #loops #unix #syntax #subdirectory

Вопрос:

У меня есть функция, которая берет файл, выполняет некоторые операции и создает кучу выходных файлов. У меня есть 100 вложенных папок с именами:

 d066, d067, d068.... d165, d166
 

У каждого из них есть только 1 файл. Что я хочу сделать, так это зайти в каждую вложенную папку, взять имя файла, применить к нему функцию, оставить вложенную папку, ввести следующую и так далее.

Я написал этот сценарий:

 for i in {60..166}; do
    
    if [ $i -lt 100 ];
    then 
        var2=d0$i
    else
        var2=d$i
    fi             
    cd $var2 || exit             
    f=$(find . -type f)   
    gd2e.py -rnxFile $f   
    cd ..                
    
done
 

Проблема в том, что мой код выходит из папки, содержащей подпапку, и останавливается. Кто-нибудь знает лучший способ сделать это ?

Комментарии:

1. Пожалуйста, добавьте подходящий shebang ( #!/bin/bash ), а затем вставьте свой скрипт в shellcheck.net и постарайтесь выполнить содержащиеся там рекомендации.

2. До сих пор похоже, что ошибки в заклинаниях, которые я допустил, были причиной того, что он не работал. Спасибо @markp-fuso за более быстрый способ сделать это ! Это также хорошо работает. Я бы хотел выбрать ваш комментарий в качестве ответа, но, поскольку вы только прокомментировали, у меня нет возможности принять его

Ответ №1:

Предполагая, что функция может работать с directoy как часть входного параметра (например, gd2e.py -rnxFile ${i}/${f} ), несколько идей по оптимизации текущего кода:

 while read -r f
do
    gd2e.py -rnxfFile "${f}"
done < <(find d{060..166} -type f)
 

Если в d{060..166} каталогах могут быть подкаталоги, которые вы не хотите сканировать, мы можем добавить a -maxdepth 1 в find :

 while read -r f
do
    gd2e.py -rnxfFile "${f}"
done < <(find d{060..166} -maxdepth 1 -type f)