Bash 脚本循环遍历所有子目录,检查脚本目录是否存在,并在那里运行脚本

Bash 脚本循环遍历所有子目录,检查脚本目录是否存在,并在那里运行脚本

我是 bash 脚本编写的新手,我正在尝试制作一个脚本,该脚本使用循环for来查找它启动的目录中的所有文件夹,然后使用语句if来查找其中的另一个文件夹,该文件夹的名称templates为 ,然后我想运行一个 python 命令来执行存储在该文件夹中的 python 脚本。

  • 我的目录结构如下所示:
    all/
        this_script.sh
        one/
            templates/
                      render_j2.py
        two/
            templates/
                      render_j2.py
    
  • 我尝试过的this_script-sh
    for file in *; do
      if [[ "$file"==*"templates"* ]];
      then
        cd $file
      fi
    done
    
    还尝试了这个:
    for file in *; do
    find . templates
    python render_j2.py; 
    done
    

我的主要问题是我无法进入该templates文件夹,即使可以进入,python 命令也无法找到要运行的 python 文件。

答案1

既然您已经在使用 find,为什么不将整个任务卸载给它呢?您可以尝试以下操作:

find . -type f -path "*/templates/render_j2.py" -execdir python render_j2.py \;

这将搜索起点以下render_j2.py目录中的所有文件,并在找到该文件的目录中执行 python 命令。templates

答案2

这有很多问题:

  • 两个版本都没有测试是否$file是目录
  • 当第一个版本使用时cd $file,$file 在下一次循环迭代中将不是有效路径,因为您更改了目录;放入cd一个子 shell(使用括号)以及您想要在该目录中执行的操作可以解决此问题。
  • 在第二个版本中,查找语法错误,无法执行您想要的操作
  • 在这样的循环中运行 find 没有意义, find 在内部执行自己的循环

像这样的事情可能会起作用:

find . -name templates -type d -execdir python {}/render_j2.py \;

这相当于

(cd all/one && python ./templates/render_j2.py )
(cd all/two && python ./templates/render_j2.py )
...

这可能仍然不完全是你想要的。

答案3

这是一种非答案,但这似乎是一个过于复杂的设置。如果您有一个未说明的原因,您必须或只是想(也许是学习)循环,那么这不会是您的答案,但是......您可以使用 find 命令执行此无循环操作。

就像是

find $HOME/my/folders -type d -name templates -exec my.py {} \;

相关内容