다른 파일에서 이러한 명령을 동시에 실행하려면 어떻게 해야 합니까?

다른 파일에서 이러한 명령을 동시에 실행하려면 어떻게 해야 합니까?

A1부터 A16까지의 이름을 가진 16개의 개별 폴더가 있고 각 폴더에는aligned.sorted.bam

aligned.sorted.bam이 명령을 사용하여 다음으로 변환하고 싶습니다 .aligned.sam

module load samtools/1.3.2

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

aligned.sam그런 다음 으로 변환counts.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

각 폴더를 반복하여 이러한 명령을 단계별로 실행할 수 있는 스크립트가 있습니까? 내 리눅스는 너무 나빠

어떤 도움을 주셔서 감사합니다

@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 코어/스레드 수가 더 많거나 적은 경우 조정합니다. 내 스레드리퍼에서는 -P 32.을 사용하거나 -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

나는 그것이 무엇을 의미하는지 모르기 module load ...때문에 대답의 이 부분이 틀렸을 수도 있습니다. 필요한 경우 스크립트를 수정할 수 있도록 실행하려는 항목을 알고 있다고 가정합니다.samtoolshtseq-count


myscript.shps: 파일을 작성하지 않는 매우 간단한 테스트를 사용하는 것이 좋습니다 .

예를 들어 다음과 같습니다.

#!/bin/sh

cd "$(dirname "$1")"

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

관련 정보