递归读取python文件并在每个文件的输出存在后停止的bash脚本

递归读取python文件并在每个文件的输出存在后停止的bash脚本,python,linux,bash,for-loop,recursion,Python,Linux,Bash,For Loop,Recursion,我有一个bash,它递归读取*.py脚本,当目录(一个*.pkl文件)中存在每个*.py文件的输出时停止。bash的主要思想是,如果输出不存在,python脚本必须再次运行,直到为每个*.py脚本创建输出为止 bash.sh model1.py model2.py model3.py model1.pkl # expected output model2.pkl # expected output model3.pkl # expected output 但是,这里有一个问题:当第二个/第三个

我有一个bash,它递归读取*.py脚本,当目录(一个*.pkl文件)中存在每个*.py文件的输出时停止。bash的主要思想是,如果输出不存在,python脚本必须再次运行,直到为每个*.py脚本创建输出为止

bash.sh
model1.py
model2.py
model3.py
model1.pkl # expected output
model2.pkl # expected output
model3.pkl # expected output
但是,这里有一个问题:当第二个/第三个输出不存在时(来自第二个/第三个。*py脚本),bash不会再次运行(而如果第一个输出不存在,bash会再次运行,这是应该的)

我的bash如下所示:

#!/bin/bash

for x in $(find . -type f -name "*.py"); do
    if [[ ! -f `basename -s .py $x`.pkl ]]; then #output with the same name of *.py file
        python3 ${x}
    else
        exit 0
    fi
done
那么,如果任何*.py脚本的输出丢失,我如何强制bash脚本再次运行呢?还是输出的名称有问题

我尝试在读取和时使用命令
,直到
,但脚本读取所有*.py文件失败


提前谢谢

试试这个:不是最好的方法,但至少能帮你朝着正确的方向前进

    keep_running(){
for f in $(find . -type f -name "*.py");
do
    file_name=$(dirname $f)/$(basename $f .py).pk1
    if [ ! -f "$file_name" ];
    then
        echo "$file_name doesn't exists" # here you can run your python script
    fi
done
}

cnt_py=0
cnt_pkl=1 

while [ $cnt_pkl -ne $cnt_py ] ; do
        keep_running
        cnt_py=`ls -1 *.py| wc -l`
        cnt_pkl=`ls -1 *.pk1| wc -l`
done

你好@change198,谢谢你的帮助!是的,现在狂欢很好!