web-dev-qa-db-ja.com

ファイルが存在する場合にプロセスをスキップするコマンド

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
ozarka

どこにテストを置くことをお勧めするかわかりませんが、[シェルコマンド、および[[ bashビルトインには、次のように使用できるテストがあります。

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

これは単なる例です。ループ本体がどのように機能するかはわかりません。したがって、テストはループ本体の他の場所に移動する必要があります。

2
Bruce Ediger

一般に、ファイルを開くことができるかどうか(入力用か出力用か)をテストする最良の方法は、単にファイルを開こうとすることです。

より具体的には、出力の場合、出力用にファイルを開くだけでnewファイルが作成される場合、POSIXシェルはsetを介して構成可能なno-clobberシェルオプションを提供します。 、したがって、これを使用して、続行する前に出力が存在するかどうかをテストできます。

現在のスクリプトを理解しようとするのは少し難しいですが、次のことを検討してください。

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
2
user155791