自动化下载并且校验文件完整性

经常下载过ngs项目公共数据集的小伙伴们都是知道fastq文件非常大而且不同数据库访问情况都不太稳定。

详见:aspera的高速下载确实很快吗,需要自己在服务器上面配置好conda,然后执行conda的安装两个软件(kingfisher和aspera),我们一般来说会推荐极简下载代码,就是一个循环而已;

首先自己制作文件名字(fq.txt )内容如下所示::

fasp.sra.ebi.ac.uk:/vol1/fastq/SRR174/083/SRR17418283/SRR17418283_1.fastq.gz
fasp.sra.ebi.ac.uk:/vol1/fastq/SRR174/083/SRR17418283/SRR17418283_2.fastq.gz
fasp.sra.ebi.ac.uk:/vol1/fastq/SRR174/086/SRR17418286/SRR17418286_1.fastq.gz
fasp.sra.ebi.ac.uk:/vol1/fastq/SRR174/086/SRR17418286/SRR17418286_2.fastq.gz
fasp.sra.ebi.ac.uk:/vol1/fastq/SRR174/087/SRR17418287/SRR17418287_1.fastq.gz
fasp.sra.ebi.ac.uk:/vol1/fastq/SRR174/087/SRR17418287/SRR17418287_2.fastq.gz
fasp.sra.ebi.ac.uk:/vol1/fastq/SRR174/090/SRR17418290/SRR17418290_1.fastq.gz
fasp.sra.ebi.ac.uk:/vol1/fastq/SRR174/090/SRR17418290/SRR17418290_2.fastq.gz

有了上面的文件(fq.txt ),接下来就只需要一个脚本即可:step1-aspera.sh

cat fq.txt |while read id
do
ascp -QT -l 300m -P33001 -k 1 \
-i ~/miniconda3/envs/download/etc/asperaweb_id_dsa.openssh \
era-fasp@$id .
done
# mamba activate download 
# nohup bash step1-aspera.sh 1>step1-aspera.log 2>&1 &
# which ascp 
## 一定要搞清楚你的软件被conda安装在哪,以及它配套的asperaweb_id_dsa.openssh 文件的路径

但是因为aspera对应的ebi数据库经常是访问有问题,会导致如下所示的下载失败;

ls -lh |cut -d" " -f5-

770 7月 19 10:03 fq.txt
 19M 7月 19 10:07 SRR17656233_1.fastq.gz
 64 7月 19 10:07 SRR17656233_1.fastq.gz.aspx
 18M 7月 19 10:07 SRR17656233_2.fastq.gz
 64 7月 19 10:07 SRR17656233_2.fastq.gz.aspx
 0 7月 19 10:07 SRR17656234_1.fastq.gz
 64 7月 19 10:08 SRR17656234_1.fastq.gz.aspx
 67M 7月 19 10:10 SRR17656234_2.fastq.gz
 64 7月 19 10:10 SRR17656234_2.fastq.gz.aspx
 0 7月 19 10:02 SRR17656237_1.fastq.gz
 0 7月 19 10:02 SRR17656237_2.fastq.gz
 0 7月 19 10:02 SRR17656238_1.fastq.gz
 0 7月 19 10:02 SRR17656238_2.fastq.gz
 0 7月 19 10:02 SRR17656241_1.fastq.gz
1.3M 7月 19 10:05 SRR17656241_2.fastq.gz
 64 7月 19 10:06 SRR17656241_2.fastq.gz.aspx

如果一次性下载好几百个文件,很容易失败几十个,然后挑出来继续下载然后继续失败,反反复复很浪费时间。这个时候可以借助于人工智能大模型写一个自动化校验文件的md5信息自动删除失败的文件然后重新下载。

如果是文件下载成功而且md5校验成功

会有如下所示的日志信息;


Completed: 268115K bytes transferred in 89 seconds
 (24415K bits/sec), in 1 file.
文件 SRR17656258_1.fastq.gz 下载成功,并且MD5校验和正确。
处理文件: SRR17656258_2.fastq.gz
尝试下载文件 (尝试次数: 1 / 10)...
Completed: 269769K bytes transferred in 74 seconds
 (29520K bits/sec), in 1 file.
文件 SRR17656258_2.fastq.gz 下载成功,并且MD5校验和正确。
处理文件: SRR17656262_1.fastq.gz
尝试下载文件 (尝试次数: 1 / 10)...
Completed: 231723K bytes transferred in 64 seconds
 (29363K bits/sec), in 1 file.
文件 SRR17656262_1.fastq.gz 下载成功,并且MD5校验和正确。
处理文件: SRR17656262_2.fastq.gz
尝试下载文件 (尝试次数: 1 / 10)...
Completed: 234184K bytes transferred in 217 seconds
 (8809K bits/sec), in 1 file.
文件 SRR17656262_2.fastq.gz 下载成功,并且MD5校验和正确。
处理文件: SRR17656229_1.fastq.gz

如果是文件下载成功但是md5校验失败

就需要代码自动化判断,然后继续尝试下载,直到md5校验成功,比如下面的两个样品,都是下载了两三次才md5校验成功。其实每次重新尝试都是可以下载成功但是校验失败。

处理文件: SRR17656233_1.fastq.gz
尝试下载文件 (尝试次数: 1 / 10)...
Completed: 554541K bytes transferred in 645 seconds
 (7032K bits/sec), in 1 file.
文件校验失败,正在重试...
尝试下载文件 (尝试次数: 2 / 10)...
Completed: 554541K bytes transferred in 942 seconds
 (4819K bits/sec), in 1 file.
文件校验失败,正在重试...
尝试下载文件 (尝试次数: 3 / 10)...
Completed: 554541K bytes transferred in 544 seconds
 (8345K bits/sec), in 1 file.
文件 SRR17656233_1.fastq.gz 下载成功,并且MD5校验和正确。

处理文件: SRR17656233_2.fastq.gz
尝试下载文件 (尝试次数: 1 / 10)...
Completed: 556271K bytes transferred in 850 seconds
 (5357K bits/sec), in 1 file.
文件校验失败,正在重试...
尝试下载文件 (尝试次数: 2 / 10)...
Completed: 556271K bytes transferred in 707 seconds
 (6437K bits/sec), in 1 file.
文件 SRR17656233_2.fastq.gz 下载成功,并且MD5校验和正确。

如果是网络失败

就不会下载到fq文件,就没办法校验,会出现下面的日志:

Startup failed, exit
md5sum: SRR17656242_1.fastq.gz: No such file or directory
文件校验失败,正在重试...
尝试下载文件 (尝试次数: 8 / 10)...
ascp: Target address not available 
Startup failed, exit
md5sum: SRR17656242_1.fastq.gz: No such file or directory
文件校验失败,正在重试...
尝试下载文件 (尝试次数: 9 / 10)...
ascp: Target address not available 
Startup failed, exit
md5sum: SRR17656242_1.fastq.gz: No such file or directory
文件校验失败,正在重试...
尝试下载文件 (尝试次数: 10 / 10)...
ascp: Target address not available 
Startup failed, exit
md5sum: SRR17656242_1.fastq.gz: No such file or directory

让我们看看人工智能大模型给出来的代码吧

我仅仅是把aspera的高速下载确实很快吗里面的基础代码发给人工智能大模型,然后给出来自己的需求,它就可以完成了:

#!/bin/bash

# 定义文件列表的文本文件路径
FILE_LIST="input.txt"

# 定义最大重试次数
MAX_RETRIES=10

# 检查文件列表文件是否存在
if [ ! -f "$FILE_LIST" ]; then
 echo "文件列表文件 $FILE_LIST 不存在。"
 exit 1
fi

# 读取文件列表文件
while read -r filename md5sum download_url; do
 echo "处理文件: $filename"

# 定义下载的文件路径
 download_path="$filename"

# 初始化重试次数
 retries=0

# 循环直到文件校验成功或达到最大重试次数
 while [ $retries -lt $MAX_RETRIES ]; do
 echo "尝试下载文件 (尝试次数: $((retries + 1)) / $MAX_RETRIES)..."

# 使用curl下载文件
 #curl -o "$download_path" -L "$download_url"
 # 使用 ascp 下载文件
ascp -QT -l 300m -P33001 -k 1 \
-i ~/miniconda3/envs/download/etc/asperaweb_id_dsa.openssh \
era-fasp@$download_url .

# 计算下载文件的MD5校验和
 actual_md5=$(md5sum "$download_path" | awk '{print $1}')

# 校验文件
 if [ "$actual_md5" = "$md5sum" ]; then
 echo "文件 $filename 下载成功,并且MD5校验和正确。"
 break
 else
 echo "文件校验失败,正在重试..."
 rm "$download_path" 
 retries=$((retries + 1))
 fi
 done

# 检查是否达到最大重试次数
 if [ $retries -eq $MAX_RETRIES ]; then
 echo "文件 $filename 下载和校验失败,已达到最大重试次数。"
 # exit 1
 fi
done < "$FILE_LIST"

上面的shell脚本需要读取一个文本文件input.txt,它的内容节选如下所示:

SRR17656233_1.fastq.gz 14f36c82df316bfcda3070db182461e6 fasp.sra.ebi.ac.uk:/vol1/fastq/SRR176/033/SRR17656233/SRR17656233_1.fastq.gz
SRR17656233_2.fastq.gz 1fdad0e3c4d17c35721d4f4fe7518f18 fasp.sra.ebi.ac.uk:/vol1/fastq/SRR176/033/SRR17656233/SRR17656233_2.fastq.gz
SRR17656234_1.fastq.gz eaf46f1d519bb050ab654d5975f4706e fasp.sra.ebi.ac.uk:/vol1/fastq/SRR176/034/SRR17656234/SRR17656234_1.fastq.gz
SRR17656234_2.fastq.gz f68099418142c70d7abae1728c4562ef fasp.sra.ebi.ac.uk:/vol1/fastq/SRR176/034/SRR17656234/SRR17656234_2.fastq.gz
SRR17656237_1.fastq.gz b30ab3b951086cef51ac545c9b06cea7 fasp.sra.ebi.ac.uk:/vol1/fastq/SRR176/037/SRR17656237/SRR17656237_1.fastq.gz
SRR17656237_2.fastq.gz 8aee6152c6c3bc280e5b120d008d9a73 fasp.sra.ebi.ac.uk:/vol1/fastq/SRR176/037/SRR17656237/SRR17656237_2.fastq.gz
SRR17656238_1.fastq.gz 2a24527bcbd9cc8faa87af1c2cd129e1 fasp.sra.ebi.ac.uk:/vol1/fastq/SRR176/038/SRR17656238/SRR17656238_1.fastq.gz
SRR17656238_2.fastq.gz 56802f4f4c0202ea72506e46720575e2 fasp.sra.ebi.ac.uk:/vol1/fastq/SRR176/038/SRR17656238/SRR17656238_2.fastq.gz
SRR17656241_1.fastq.gz ccdad148ae44ca4d7be4ba95a5c383c0 fasp.sra.ebi.ac.uk:/vol1/fastq/SRR176/041/SRR17656241/SRR17656241_1.fastq.gz
SRR17656241_2.fastq.gz 25533fed6cba16c073ef26080cc948cc fasp.sra.ebi.ac.uk:/vol1/fastq/SRR176/041/SRR17656241/SRR17656241_2.fastq.gz

Comments are closed.