我如何在不同文件的同时运行这些命令

我如何在不同文件的同时运行这些命令

请想象我有 16 个名为 A1 到 A16 的独立文件夹,每个文件夹中都有一个名为aligned.sorted.bam

通过这些命令我想转换aligned.sorted.bamaligned.sam

module load samtools/1.3.2

samtools view -h -o aligned.sam aligned.sorted.bam

然后通过下面的命令转换aligned.samcounts.txt

module load htseq/0.6.1

htseq-count --stranded=no -q aligned.sam /local/software/DropSeq/STAR_Genomes/STAR_hg38_Genome/metadata/Homo_sapiens.GRCh38.dna.primary_assembly.gtf > counts.txt

是否有一个脚本可以遍历每个文件夹并为我逐步执行这些命令?我linux太差了

感谢您的任何帮助

通过 @cas 请帮助我写了这个脚本

#!/bin/sh

find /temp/hgig/fi1d18/bin/TruSeq300719-139385266/FASTQ_Generation_2019-08-03_04_28_02Z-190932857/335T/ -type f -name aligned.sorted.bam -print0 | \
  xargs -0r -n 1 -P 8 /temp/hgig/fi1d18/bin/TruSeq300719-139385266/FASTQ_Generation_2019-08-03_04_28_02Z-190932857/script.sh


    cd "$(/temp/hgig/fi1d18/bin/TruSeq300719-139385266/FASTQ_Generation_2019-08-03_04_28_02Z-190932857/335T/ "$1")"

    module load samtools/1.3.2
    samtools view -h -o aligned1.sam "$1"

    module load htseq/0.6.1
    htseq-count --stranded=no -q aligned1.sam /local/software/DropSeq/STAR_Genomes/STAR_hg38_Genome/metadata/Homo_sapiens.GRCh38.dna.primary_assembly.gtf > counts.txt

然后在终端我输入

chmod +x script.sh

但什么也没发生

抱歉,最新更改我使 script.sh 可执行,然后运行了此命令

 [fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ find 353T -type f -name aligned.sorted.bam -print0 | \ xargs -0r -n 1 -P 8 script.sh
    -bash:  xargs: command not found

[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ find T{}/ -type f -name aligned.sorted.bam -print0 | \ xargs -0r -n 1 -P 8 script.sh
-bash:  xargs: command not found
find: `T{}/': No such file or directory
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ find T{} -type f -name aligned.sorted.bam -print0 | \ xargs -0r -n 1 -P 8 script.sh
-bash:  xargs: command not found
find: `T{}': No such file or directory
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ find T -type f -name aligned.sorted.bam -print0 | \ xargs -0r -n 1 -P 8 script.sh
-bash:  xargs: command not found
find: `T': No such file or directory
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$

    [fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ ls
    305N  305T  310N  310T  324T  327T  335T  337N  337T  338T  344T  346T  349T  353B  353N  353T  script.sh
    [fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$

我删除了 \

[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ find T -type f -name aligned.sorted.bam -print0 | xargs -0r -n 1 -P 8 script.sh
find: `T': No such file or directory
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ ls
305N  305T  310N  310T  324T  327T  335T  337N  337T  338T  344T  346T  349T  353B  353N  353T  script.sh
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$

基于@cas 的最新推荐

[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$ find . -type f -name aligned.sorted.bam -print0 | xargs -0r -n 1 -P 8 script.sh
xargs: script.sh: Text file busy
xargs: script.shxargs: : Text file busyscript.sh
: Text file busy
xargs: script.sh: Text file busy
xargs: script.sh: Text file busy
xargs: script.shxargs: : Text file busyscript.sh
: Text file busy
[fi1d18@cyan01 FASTQ_Generation_2019-08-03_04_28_02Z-190932857]$

答案1

作为粗略的猜测,类似以下的内容可能会起作用:

find ./A{1..16}/ -type f -name aligned.sorted.bam -print0 | 
  xargs -0r -n 1 -P 8 ./myscript.sh

这将并行运行多个实例myscript.sh-P 8一次运行 8 个。如果您有更多或更少的 CPU 核心/线程,请进行调整 - 在我的 threadripper 上,我会使用-P 32. 或 use-P 0来运行尽可能多的实例),给定一个文件名参数脚本的每个实例。

myscript.sh会是这样的:

#!/bin/sh

cd "$(dirname "$1")"

module load samtools/1.3.2
samtools view -h -o aligned.sam "$1"

module load htseq/0.6.1
htseq-count --stranded=no -q aligned.sam /local/software/DropSeq/STAR_Genomes/STAR_hg38_Genome/metadata/Homo_sapiens.GRCh38.dna.primary_assembly.gtf > counts.txt

这必须通过chmod +x myscript.sh.上面的命令xargs假设它位于当前目录中。您可以将它放在 PATH 的某个位置(~/bin/对于您自己的脚本来说是一个好地方,只需将其添加到您的 $PATH 中~/.bashrc),然后运行myscript.sh而不是./myscript.sh.

我不知道or或 是什么module load ...意思,所以我完全有可能把这部分答案弄错了。我假设您知道要运行什么,因此可以根据需要修复脚本。samtoolshtseq-count


ps:我建议使用非常简单的myscript.sh不写入任何文件的测试。

例如这样的东西:

#!/bin/sh

cd "$(dirname "$1")"

echo process-id $$ is in $(pwd), processing file "$1"

相关内容