Shell命令在使用find后保存子文件夹中的输出?

时间:2017-04-18 16:52:46

标签: shell find

我有一个包含多个子文件夹的主目录。每个子文件夹都包含一个* .fna文件,我希望我的脚本使用fna文件执行命令,并将输出写回子文件夹。 正如我的脚本现在,它在主目录中生成一个大文件,但我希望每个子文件夹中的每个子文件夹的输出。

find * |grep fna$ |while read fna ; do formatdb -i $fna -p F ; blastall -p blastn/ 
-d $fna -i plasmiddb_genes_renamed.fsa -m 8 -e 1E-30 |while read hit ; do echo/
$fna $hit ; done ; done > $fna.blast_plasmidrefdb.out

2 个答案:

答案 0 :(得分:0)

几种方式

  • 捕获 $ fna 值的dirname
      

    在阅读fna时找到* | grep fna $ |; fdir = dirname $fna; formatdb -i $ fna -p F; blastall -p blastn /   -d $ fna -i plasmiddb_genes_renamed.fsa -m 8 -e 1E-30 | while read hit;回声/   $ fna $ hit | tee $ {fdir} /out.txt ;完成完成> $ fna.blast_plasmidrefdb.out

  • 使用带有后缀的 $ fna 路径:例如$ {} FNA .OUT
      

    在阅读fna时找到* | grep fna $ |;做formatdb -i $ fna -p F; blastall -p blastn /   -d $ fna -i plasmiddb_genes_renamed.fsa -m 8 -e 1E-30 | while read hit;回声/   $ fna $点击 | tee $ {fna} .out ;完成完成> $ fna.blast_plasmidrefdb.out

使用了| tee,以防你还想在一个文件中捕获。

压缩one liner甚至更多

  

for fna in $(find。-type f -name" * .fna");做formatdb -i $ fna -p F; blastall -p blastn / -d $ fna -i plasmiddb_genes_renamed.fsa -m 8 -e 1E-30 | tee $ {fna} .out;完成

答案 1 :(得分:0)

如果find支持,请使用-execdir:

find . -name '*.fna' -execdir sh -c '{ 
    formatdb -i $0 -p F; blastall -p blastn -d $0 \
        -i /path/to/plasmiddb_genes_renaed.fsa -m 8 -e 1E-30; 
    } > $0.output' {} \;

这将为包含* .fna文件的目录中的每个* .fna文件生成一个输出文件。请注意,您需要使用plasmiddb_genes_renaed.fsa的完整路径。