让 wget 只下载列表中的新项目

Get wget to download only new items from a list

我有一个包含文件路径列表的文件。我正在用 wget 像这样下载它们:

wget -i cram_download_list.txt

但是列表很长,我的会话被打断了。我想查看已经存在文件的目录,只下载未完成的文件。

我一直在尝试想出一个涉及 comm 的选项,但无法弄清楚如何使用 wget 循环它。

文件内容如下所示:

ftp://ftp.sra.ebi.ac.uk/vol1/run/ERR323/ERR3239280/NA07037.final.cram
ftp://ftp.sra.ebi.ac.uk/vol1/run/ERR323/ERR3239286/NA11829.final.cram
ftp://ftp.sra.ebi.ac.uk/vol1/run/ERR323/ERR3239293/NA11918.final.cram
ftp://ftp.sra.ebi.ac.uk/vol1/run/ERR323/ERR3239298/NA11994.final.cram

我目前正在尝试做这样的事情:

ls *.cram | sed 's/^/ftp:\/\/ftp.sra.ebi.ac.uk\/vol1\/run\/ERR323\/ERR3239480\//' > downloaded.txt
comm -3 <(sort cram_download_list.txt) <(sort downloaded.txt) | tr -d " \t" > to_download.txt
wget -i to_download_final.txt
wget -c -i <(find -type f -name '*.cram' -printf '%f$\n' |\
             grep -vf - cram_download_list.txt )

查找以 cram 结尾的文件并打印它们后跟 $ 和一个换行符。这用于下载列表的反向正则表达式匹配列表,即从下载列表中删除以现有文件名结尾的任何行。

添加: -c 用于完成不完整的文件(即恢复下载)

注意:不能很好地处理文件名中的空格或换行符,但这些是 ftp-URL,因此首先应该不是问题。

如果您还想处理部分传输的文件,您总是需要传入完整的文件名集,wget 可以检查长度。这意味着对于这种情况,唯一的方法是:

wget -c -i cram_download_list.txt

已经完成的文件只会被检查并跳过。

I’d like to look at the directory for which files already exist, and only download the outstanding ones.

要获得此类行为,您可以使用 -nc(别名 --no-clobber)标志。它确实会跳过会下载到现有文件(覆盖它们)的下载。所以在你的情况下

wget -nc -i cram_download_list.txt

请注意,此解决方案无法处理部分下载的文件。