파일이 있으면 프로세스를 건너뛰는 명령

파일이 있으면 프로세스를 건너뛰는 명령

여러 파일의 파이프라인을 실행하기 위해 for 루프를 사용했지만 불행하게도 터미널이 중간에 멈췄습니다. 파이프라인을 다시 실행하고 싶지만 시간 문제로 인해 출력 파일이 생성된 디렉터리를 건너뛰고 싶습니다. 기본적으로 중첩된 if 문 - 파일 출력 파일이 존재하는 경우 파이프를 실행하지 않으면 무시합니다. 가능합니까?

for f in /Volumes/My\ Passport/Documents/Projects/untitled\ folder\ 2/untitled\ folder\ 3/untitled\ folder\ 2/untitled\ folder/*/*_1.fastq; do
subdir="${f%/*}"
pushd "$subdir" &>/dev/null
file1="${f##*/}"
file2="${file1%_1.fastq}_2.fastq"
adapter="/Volumes/My\ Passport/Documents/adapters.fa"
reference="/Volumes/My\ Passport/Documents/ucsc_hg19/ucsc.hg19.fasta"
dbSNP="/Volumes/My\ Passport/Documents/ucsc_hg19/dbsnp_138.hg19"
COSMIC="/Volumes/My\ Passport/Documents/ucsc_hg19/CosmicCodingMuts.vcf"
interval="/Volumes/My\ Passport/Documents/plist.bed"
sjdb="/Volumes/My\ Passport/Documents/ucsc_hg19/ucsc.hg19.gtf"
file3="${file1%_1.fastq}_1_trimmed.fastq"
file4="${file2%_2.fastq}_2_trimmed.fastq"

#preQC (cutadapt -O subtracted, prinseq -min_qual_score 4 -ns_max_p 2 subtracted)
~/Desktop/UTSW/Applications/bbmap/bbduk.sh -Xmx120g in1="${file1}" in2="${file2}" out1="${file1%_1.fastq}_1_trimmed.fastq" out2="${file2%_2.fastq}_2_trimmed.fastq" ref="${adapter}" trimq=10

paste - - - - < "${file3}" | sort -k1,1 -t " " | tr "\t" "\n" > "${file3%_1_trimmed.fastq}_trimmed_sorted_1.fastq"
paste - - - - < "${file4}" | sort -k1,1 -t " " | tr "\t" "\n" > "${file4%_2_trimmed.fastq}_trimmed_sorted_2.fastq"

parallel -j $PARALLEL_TASKS perl ~/UTSW/Applications/prinseq-lite-0.20.4/prinseq-lite.pl -fastq "${file3%_1_trimmed.fastq}_trimmed_sorted_1.fastq" -fastq2 "${file4%_2_trimmed.fastq}_trimmed_sorted_2.fastq" -no_qual_header -trim_right 1 -custom_params "A 75%;T 75%;G 75%;C 75%" min_qual_mean 25 -min_len 40 -out_format 3 -out_good "${f%.*}_QC" -out_bad null -log

done

답변1

어디에서 테스트를 권장해야 할지 잘 모르겠지만 [쉘 명령과 [[bash 내장 기능 모두 다음과 같이 사용할 수 있는 테스트가 있습니다.

for f in ...
do
    if [[ ! -e "$f" ]]
    then
        # do work here because file $f does not exist
    fi
done

이것은 단지 예일 뿐이며 루프 본문이 무엇을 하는지 잘 모르겠습니다. 따라서 테스트는 루프 본문의 다른 곳으로 가야 할 수도 있습니다.

답변2

일반적으로 파일을 열 수 있는지(입력 또는 출력용으로) 테스트하는 가장 좋은 방법은 파일을 열어보는 것입니다.

더 구체적으로 말하자면, 출력의 경우 출력용 파일을 열려는 경우 이렇게 하면새로운POSIX 쉘에서 제공하는 파일손상 없음셸 옵션은 구성 가능하므로 set이를 사용하여 계속하기 전에 출력이 있는지 테스트할 수 있습니다.

현재 스크립트를 이해하는 것은 약간 어렵지만 다음을 고려해 보십시오.

set -C -- '/Volumes/My Passport/Documents/Projects/untitled folder 2/untitled folder 3/untitled folder 2/untitled folder/'*/*_1.fastq
[ -e "$1" ] &&
for f
do    if    cd -- "${f%/*}" &&
            f=${f##*/} f=${f%1*}
      then  if    command exec \
                      3> "$f"1_trimmed.fastq \
                      4> "$f"2_trimmed.fastq \
                      5> "$f"_trimmed_sorted_1.fastq \
                      6> "$f"_trimmed_sorted_2.fastq
            then  ~/Desktop/UTSW/Applications/bbmap/bbduk.sh -Xmx120g in1="$f"1.fastq in2="$f"2.fastq out1=/dev/fd/3 out2=/dev/fd/4 ref="${adapter}" trimq=10 &&
                  paste - - - - < "$f"1_trimmed.fastq | sort ... | tr >&5 ... &&
                  paste - - - - < "$f"2_trimmed.fastq | sort ... | tr >&6 ... 
            fi
       fi
 done

관련 정보