如何在 bash 中并行执行脚本?

How to execute a script in parallel in bash?

我有一个文件夹,其中包含扩展名为 .bam 的文件。我想 运行 同时跟踪脚本并为每个输入名称和扩展名创建单独的输出 .txt

samtools depth -ab target_interval.bed 12345XX.bam > 12345XX.txt

此命令适用于单个文件。我想立即执行这段代码 我尝试了以下代码

for i in *.bam; do
samtools depth -ab target_interval.bed $i.bam > $i.txt
done

但效果不佳

for i in *.bam; do
samtools depth -ab target_interval.bed $i.bam > $i.txt &
sleep .5
done
# list all files matched with '*.bam' on separate lines
find . -maxdepth 1 -type f -name '*.bam' |
# remove bam suffix from all the files
sed 's/\.bam$//' | 
# use `xargs` to parallelize execution on nproc codes
xargs -d$'\n' -n1 -P$(nproc) sh -c '
     samtools depth -ab target_interval.bed "".bam > "".txt' --

既然你提到了'parallel'这个词,你也可以用GNU Parallel批处理这些。像这样的东西应该可以工作:

parallel "samtools depth -ab target_interval.bed {} > {= s/\.bam/.txt/ =}" ::: *bam

请注意您有足够的内存来一次处理多个 BAM。

人们对这个问题投了反对票。 我对脚本做了简单的修改。我刚刚删除了 $i.bam 并只保留了 $i 。如果我使用 $i.bam,它会读取类似 x.bam.bam 的文件,该文件在目录

中不可用

更新后的代码是:

for i in *.bam; do
samtools depth -ab target_interval.bed $i > $i.txt;
done

干杯!!!

使用制作

BAMS=$(shell find . -type f -name "*.bam")
%.txt:%.bam
    samtools depth   -ab target_interval.bed $< > $@

all: $(BAMS:.bam=.txt)

调用:make -j 4