背景介绍
最近我需要通过FTP站点下载合作者提供的测序数据,因此研究了一下怎么快速地从FTP站点下载文件。
测试的工具主要是ftp
和lftp
什么是FTP?
FTP,全称为“File Transfer Protocol”(文件传输协议),是互联网上的一种老牌协议,用于在网络上的计算机之间传输文件。想象一下,FTP就像是一位资深的邮差,专门负责把文件从一个地方送到另一个地方。
使用FTP下载数据
安装ftp
Linux系统上一般自带了ftp这个命令行工具,如果没有的话你得安装一下(需要管理员权限):
# Debian and Ubuntu
sudo apt-get install ftp
# centos
sudo yum install ftp
登陆FTP站点
安装完成后,我们就可以登录FTP站点了。在终端输入:
ftp your-ftp-host
一般而言,这个host是一个ip地址。
然后输入用户名
和密码
,你就连接上FTP啦。
下载文件
在FTP站点,你可以使用get
命令加上文件名下载文件。输入:
get your-file
但是我实测完发现这个比较慢,所以我转头搜了一下有没有别的命令,然后就找到了一个叫lftp
的命令。
🚀 什么是lftp
lftp
要比刚刚介绍的 ftp 功能更加强大和灵活。它支持FTP, HTTP, SFTP, FISH等协议,并且拥有一大堆令人眼花缭乱的特性,比如镜像下载、断点续传、并行下载和带宽限制等。简而言之,用lftp
就完事儿了。
安装lftp
可以用conda一键安装lftp
:
conda install -c conda-forge lftp
帮助文档如下:
lftp [-d] [-e cmd] [-p port] [-u user[,pass]] [site]
基本常用的选项就是-p
和-u
登陆FTP站点
使用lftp登录FTP站点与使用ftp类似。在终端输入:
lftp your-ftp-host
然后输入用户名和密码,即可进入FTP站点。
当然,也可以直接一步到位:
lftp -u <USER>,<PassWD> <host>
# 例如:
lftp -u test,test123 127.0.0.1
登录上之后就可以用类似于linux的一些命令来查询ftp站点里的信息,例如输入ls
可以列出所有的文件和文件夹,或者使用find
在ftp站点里进行快速查找文件。详细的可用命令的列表可以参考:
https://lftp.yar.ru/lftp-man.html
如何用lftp下载文件
如果你就下载单个文件,可以使用lftpget
或者pget
:
使用lftpget下载
lftpget
,它允许你不用登录FTP站点,直接从命令行直接下载文件:
lftpget ftp://username:password@your-ftp-host/path/to/your-file
当然,你也可以写循环来完成多个文件的下载
for i in `ls *md5`
do
lftpget -v -c ftp://<USER>:<PassWD>@<IP host>/Project/${i%.*}
done
用pget进行单个文件下载
如果你想加速单个文件的下载,可以使用pget
命令,它可以使用多线程进行下载,加快下载速度。
首先用lftp登录ftp站点,然后在lftp的提示符下输入:
pget -c -n 10 Project/test_R1.fastq.gz
这里-c
是断点续传,-n
可以指定并行的数量。
这样pget
就可以使用多个连接来加速文件的下载啦。
用mget进行多文件的下载
如果你要下载多个文件,可以使用mget
。
下面是 mget 命令的基本语法:
mget [options] <file1> [<file2> ...]
这里 <file1>
, <file2>
, ... 是你要下载的文件的名称或通配符。
mget
命令支持以下选项:
-
-c
:继续之前被中断的下载。 -
-O <directory>
:设置下载文件的输出目录。 -
-E
: 在成功传输后删除源文件 -
-e
: 在传输前删除目标文件 -
--exclude=<pattern>
:排除与给定模式匹配的文件。 -
--include=<pattern>
:仅包含与给定模式匹配的文件。
这里-e和-E分别是:
-E
:此选项用于在文件成功从远程服务器下载到本地之后,删除远程服务器上的源文件。这意味着文件已经被成功下载,然后才会删除远程的副本。-e
:此选项用于在从远程服务器下载文件之前,先删除本地的目标文件。这通常在您希望覆盖本地已有的同名文件时使用。删除本地文件是为了确保不会有冲突或错误,然后从远程服务器下载新的文件。
-E
选项涉及到远程服务器上的文件,而-e
选项涉及到本地的文件。在任何情况下,文件的删除都是在传输完成或开始之后进行的,以确保不会丢失数据。
举例:
- 使用默认设置下载一个目录中的所有文件:
lftp -c 'mget ftp://example.com/path/to/directory/*'
- 从一个目录下载所有的
.txt
文件,并将它们保存到本地的my_downloads
目录:
lftp -c 'mget -O my_downloads ftp://example.com/path/to/directory/*.txt'
- 使用排除和包含选项下载指定类型的文件:
lftp -c 'mget --include=*.txt --exclude=*backup* ftp://example.com/path/to/directory/*'
请注意,使用 mget
下载大量文件时,可能会占用大量的网络带宽和系统资源。在使用此命令时要谨慎,并考虑可能对网络和服务器的影响。
萌哥碎碎念
断更了很久,一方面当时确实是要准备oral exam,没有精力持续更新。
另一方面是,我突然找不到更新的理由。
或者说,我没想明白我更新这个公众号的意义是什么。
人嘛,就经常会陷入寻找意义和找不到意义的循环和陷阱里。现在大概想明白一些了,持续输出本身就是一种意义。
另外,这也是一种能力和核心价值的体现。
并且是一种很好的对自我的整理和锻炼。
不管是为了自己而写,还是为了在座的各位,反正,不输出、不展示别人就不知道你有多厉害。
让世界看到我的价值。
对了,为了让自己写起来更轻松愉快,我让GPT4给我写个初稿,然后在上面改。目前感觉GPT生成的初稿还不是很合我的心意,接下来多调试一些prompt让它更聪明一些。又多了一种乐趣。
祝你心情愉快。