我是 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 {} \;