在Linux下用ftp和lftp从FTP站点下载文件

背景介绍

最近我需要通过FTP站点下载合作者提供的测序数据,因此研究了一下怎么快速地从FTP站点下载文件。

测试的工具主要是ftplftp

什么是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选项涉及到本地的文件。在任何情况下,文件的删除都是在传输完成或开始之后进行的,以确保不会丢失数据。

举例:

  1. 使用默认设置下载一个目录中的所有文件:
lftp -c 'mget ftp://example.com/path/to/directory/*'
  1. 从一个目录下载所有的 .txt 文件,并将它们保存到本地的 my_downloads 目录:
lftp -c 'mget -O my_downloads ftp://example.com/path/to/directory/*.txt'
  1. 使用排除和包含选项下载指定类型的文件:
lftp -c 'mget --include=*.txt --exclude=*backup* ftp://example.com/path/to/directory/*'

请注意,使用 mget 下载大量文件时,可能会占用大量的网络带宽和系统资源。在使用此命令时要谨慎,并考虑可能对网络和服务器的影响。

萌哥碎碎念

断更了很久,一方面当时确实是要准备oral exam,没有精力持续更新。

另一方面是,我突然找不到更新的理由。

或者说,我没想明白我更新这个公众号的意义是什么。

人嘛,就经常会陷入寻找意义和找不到意义的循环和陷阱里。现在大概想明白一些了,持续输出本身就是一种意义。

另外,这也是一种能力和核心价值的体现。

并且是一种很好的对自我的整理和锻炼。

不管是为了自己而写,还是为了在座的各位,反正,不输出、不展示别人就不知道你有多厉害。

让世界看到我的价值。

对了,为了让自己写起来更轻松愉快,我让GPT4给我写个初稿,然后在上面改。目前感觉GPT生成的初稿还不是很合我的心意,接下来多调试一些prompt让它更聪明一些。又多了一种乐趣。

祝你心情愉快。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容