ディレクトリを検索からファイルの場所に変更し、2つの階層の上のスクリプトを実行します(同じディレクトリにあるように) - bash

ディレクトリを検索からファイルの場所に変更し、2つの階層の上のスクリプトを実行します(同じディレクトリにあるように) - bash

質問:

こんにちは、複数のディレクトリ(/ path / to / * .faaなど)にある各* .faaファイルを繰り返したいと思います。

次に、スクリプトが* .faaファイルと同じディレクトリにあるように、スクリプト(./script.py)を使用します。シェルスクリプトでこれは可能ですか?

私が試したこと:

for FAA in $(find . -name "*.faa")
do
    cd ../$FAA
    python3 ../script.py
done

私はこれを変更しようとしましたが、ディレクトリをファイルに変更しても機能しませんが、ディレクトリにアクセスする方法がわかりません。

希望の出力:

/path/to/1.faa、path/2/2.faa など、複数のディレクトリにある各 .faa ファイルに対して、上記の 2 つのレベルでスクリプトを実行します。すべての* .faaファイルと同じディレクトリにあるのと同じです。あるいは、これが不可能な場合、同様のことを達成するための最良の解決策は何ですか?

ベストアンサー1

find . -type f -name '*.faa' -execdir python3 ../script.py ';'

これはpython3 ../script.py次のディレクトリで実行されます。作業ディレクトリでファイルを探します。

../script.pyあなたのテキストとコードがやや衝突しているのか、それでなければならないのかわかりません../../script.py

script.pyまた、指定されたディレクトリでファイルが実際に利用可能な場合にのみ機能することに注意してください。スクリプトファイルの絶対パスを提供する方が安全です。

find . -type f -name '*.faa' -execdir python3 /path/to/script.py ';'

.faa上記のコードは、ディレクトリに複数のファイルがある場合でも、見つかったすべてのファイルに対してスクリプトを実行します。 1つ以上のファイルを含む各ディレクトリに対して一度だけスクリプトを実行するには、次の手順を実行します.faa

find . -type d -exec sh -c '
    for dir do
        set -- "$dir"/*.faa
        if [ "$#" -gt 0 ]; then
            ( cd "$dir" && python3 /path/to/script.py )
        fi
    done' sh {} +

これにより、見つかった各ディレクトリに対して短いシェルスクリプトが実行されます。スクリプトは、ディレクトリに.faaファイルがあることを確認します。存在する場合は、このディレクトリを作業ディレクトリとして使用してPythonスクリプトを実行します。

関連:

おすすめ記事