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 にオフロードするのはどうでしょうか?次のことを試すことができます。

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

関連情報