以下に示すように、複数のサブディレクトリを持つ親ディレクトリがあります。
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
グローバルを拡張するにはシェルが必要です。