私は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 にオフロードするのはどうでしょうか?次のことを試すことができます。
find . -type f -path "*/templates/render_j2.py" -execdir python render_j2.py \;
render_j2.py
その後、開始点の下のディレクトリ内のすべてのファイルを検索し、ファイルがあるディレクトリでpythonコマンドを実行します。templates
答え2
ここには多くの問題があります。
- どちらのバージョンも
$file
ディレクトリかどうかをテストしません。 - 最初のバージョンでは、ディレクトリを変更してそのディレクトリで実行しようとしているため、
cd $file
$ fileは次のループ反復で有効なパスになりません。cd
- 2番目のバージョンでは、目的の操作を実行できない構文エラーを見つけます。
- このようなループで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 {} \;