循环遍历子目录并在每个子目录中执行 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

在上面的循环中,括号创建了一个子 shell。这可以防止cd影响脚本的其余部分,并且我们不必cd在运行 Perl 脚本后退出目录。

该循环将迭代所有子目录Parent_directory并执行每个子目录中给定的命令。

答案2

如果您find支持-execdir谓词(至少是 GNU、BSD):

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

搜索perlscript.pl文件并在其上运行,perl并将当前目录设置为找到它的目录。

我们需要一个 shell 来扩展*.fasta全局。

相关内容