サブディレクトリを繰り返し、各サブディレクトリでPerlスクリプトを実行します。

サブディレクトリを繰り返し、各サブディレクトリでPerlスクリプトを実行します。

以下に示すように、複数のサブディレクトリを持つ親ディレクトリがあります。

Parent_directory
    subdirectory_1
        perlscript.pl 
        file.fasta
    subdirectory_2
        perlscript.pl 
        file_2.fasta

すべてのサブディレクトリでPerl sciptを実行したいと思います。次のコマンドを使用しようとしています

find . -type d | while read d; do perl hoz-3-v1c.pl $d/* ; done

ただし、出力は親ディレクトリに渡されるため、各子ディレクトリに出力を望んでいます。

答え1

findこのような場合はまったく悩む必要はないようです。

for dirpath in Parent_directory/*/; do
    ( cd "$dirpath" && perl perlscript.pl *.fasta )
done

これは、Perlスクリプトが常に呼び出されperlscript.pl(例ディレクトリレイアウトに示すように)、各ディレクトリでPerlスクリプトを実行する正しい方法は次のとおりです。

perl perlscript.pl *.fasta

上のループでは、括弧はサブシェルを生成します。これはスクリプトの残りの部分に影響を与えず、Perlスクリプトを実行した後にディレクトリを終了するcd必要はありません。cd

このループはすべてのサブディレクトリを繰り返しParent_directory、各サブディレクトリで指定されたコマンドを実行します。

答え2

find述語をサポートする場合-execdir(少なくともGNU、BSD):

find . -name perlscript.pl -execdir sh -c 'exec perl ./perlscript.pl *.fasta' \;

ファイルを検索しperlscript.plて実行して、perl現在のディレクトリをそのファイルが見つかったディレクトリに設定します。

*.fastaグローバルを拡張するにはシェルが必要です。

関連情報