我有一个包含多个子目录的父目录,如下所示
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
全局。