在Linux下用ftp和lftp從FTP站點(diǎn)下載文件

背景介紹

最近我需要通過FTP站點(diǎn)下載合作者提供的測(cè)序數(shù)據(jù),因此研究了一下怎么快速地從FTP站點(diǎn)下載文件。

測(cè)試的工具主要是ftplftp

什么是FTP?

FTP,全稱為“File Transfer Protocol”(文件傳輸協(xié)議),是互聯(lián)網(wǎng)上的一種老牌協(xié)議,用于在網(wǎng)絡(luò)上的計(jì)算機(jī)之間傳輸文件。想象一下,F(xiàn)TP就像是一位資深的郵差,專門負(fù)責(zé)把文件從一個(gè)地方送到另一個(gè)地方。

使用FTP下載數(shù)據(jù)

安裝ftp

Linux系統(tǒng)上一般自帶了ftp這個(gè)命令行工具,如果沒有的話你得安裝一下(需要管理員權(quán)限):

# Debian and Ubuntu
sudo apt-get install ftp
# centos
sudo yum install ftp

登陸FTP站點(diǎn)

安裝完成后,我們就可以登錄FTP站點(diǎn)了。在終端輸入:

ftp your-ftp-host

一般而言,這個(gè)host是一個(gè)ip地址。

然后輸入用戶名密碼,你就連接上FTP啦。

下載文件

在FTP站點(diǎn),你可以使用get命令加上文件名下載文件。輸入:

get your-file

但是我實(shí)測(cè)完發(fā)現(xiàn)這個(gè)比較慢,所以我轉(zhuǎn)頭搜了一下有沒有別的命令,然后就找到了一個(gè)叫lftp的命令。

?? 什么是lftp

lftp 要比剛剛介紹的 ftp 功能更加強(qiáng)大和靈活。它支持FTP, HTTP, SFTP, FISH等協(xié)議,并且擁有一大堆令人眼花繚亂的特性,比如鏡像下載、斷點(diǎn)續(xù)傳、并行下載和帶寬限制等。簡(jiǎn)而言之,用lftp 就完事兒了。

安裝lftp

可以用conda一鍵安裝lftp

conda install -c conda-forge lftp

幫助文檔如下:

lftp [-d] [-e cmd] [-p port] [-u user[,pass]] [site]

基本常用的選項(xiàng)就是-p-u

登陸FTP站點(diǎn)

使用lftp登錄FTP站點(diǎn)與使用ftp類似。在終端輸入:

lftp your-ftp-host

然后輸入用戶名和密碼,即可進(jìn)入FTP站點(diǎn)。
當(dāng)然,也可以直接一步到位:

lftp -u <USER>,<PassWD> <host>
# 例如:
lftp -u test,test123 127.0.0.1

登錄上之后就可以用類似于linux的一些命令來查詢ftp站點(diǎn)里的信息,例如輸入ls可以列出所有的文件和文件夾,或者使用find在ftp站點(diǎn)里進(jìn)行快速查找文件。詳細(xì)的可用命令的列表可以參考:

https://lftp.yar.ru/lftp-man.html

如何用lftp下載文件

如果你就下載單個(gè)文件,可以使用lftpget或者pget

使用lftpget下載

lftpget,它允許你不用登錄FTP站點(diǎn),直接從命令行直接下載文件:

lftpget ftp://username:password@your-ftp-host/path/to/your-file

當(dāng)然,你也可以寫循環(huán)來完成多個(gè)文件的下載


for i in `ls *md5`
do 
lftpget -v -c  ftp://<USER>:<PassWD>@<IP host>/Project/${i%.*}
done

用pget進(jìn)行單個(gè)文件下載

如果你想加速單個(gè)文件的下載,可以使用pget命令,它可以使用多線程進(jìn)行下載,加快下載速度。

首先用lftp登錄ftp站點(diǎn),然后在lftp的提示符下輸入:

pget -c -n 10 Project/test_R1.fastq.gz

這里-c是斷點(diǎn)續(xù)傳,-n可以指定并行的數(shù)量。

這樣pget就可以使用多個(gè)連接來加速文件的下載啦。

用mget進(jìn)行多文件的下載

如果你要下載多個(gè)文件,可以使用mget。
下面是 mget 命令的基本語法:

mget [options] <file1> [<file2> ...]

這里 <file1>, <file2>, ... 是你要下載的文件的名稱或通配符。

mget 命令支持以下選項(xiàng):

  • -c:繼續(xù)之前被中斷的下載。
  • -O <directory>:設(shè)置下載文件的輸出目錄。
  • -E: 在成功傳輸后刪除源文件
  • -e: 在傳輸前刪除目標(biāo)文件
  • --exclude=<pattern>:排除與給定模式匹配的文件。
  • --include=<pattern>:僅包含與給定模式匹配的文件。

這里-e和-E分別是:

  • -E:此選項(xiàng)用于在文件成功從遠(yuǎn)程服務(wù)器下載到本地之后,刪除遠(yuǎn)程服務(wù)器上的源文件。這意味著文件已經(jīng)被成功下載,然后才會(huì)刪除遠(yuǎn)程的副本。
  • -e:此選項(xiàng)用于在從遠(yuǎn)程服務(wù)器下載文件之前,先刪除本地的目標(biāo)文件。這通常在您希望覆蓋本地已有的同名文件時(shí)使用。刪除本地文件是為了確保不會(huì)有沖突或錯(cuò)誤,然后從遠(yuǎn)程服務(wù)器下載新的文件。

-E選項(xiàng)涉及到遠(yuǎn)程服務(wù)器上的文件,而-e選項(xiàng)涉及到本地的文件。在任何情況下,文件的刪除都是在傳輸完成或開始之后進(jìn)行的,以確保不會(huì)丟失數(shù)據(jù)。

舉例:

  1. 使用默認(rèn)設(shè)置下載一個(gè)目錄中的所有文件:
lftp -c 'mget ftp://example.com/path/to/directory/*'
  1. 從一個(gè)目錄下載所有的 .txt 文件,并將它們保存到本地的 my_downloads 目錄:
lftp -c 'mget -O my_downloads ftp://example.com/path/to/directory/*.txt'
  1. 使用排除和包含選項(xiàng)下載指定類型的文件:
lftp -c 'mget --include=*.txt --exclude=*backup* ftp://example.com/path/to/directory/*'

請(qǐng)注意,使用 mget 下載大量文件時(shí),可能會(huì)占用大量的網(wǎng)絡(luò)帶寬和系統(tǒng)資源。在使用此命令時(shí)要謹(jǐn)慎,并考慮可能對(duì)網(wǎng)絡(luò)和服務(wù)器的影響。

萌哥碎碎念

斷更了很久,一方面當(dāng)時(shí)確實(shí)是要準(zhǔn)備oral exam,沒有精力持續(xù)更新。

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

或者說,我沒想明白我更新這個(gè)公眾號(hào)的意義是什么。

人嘛,就經(jīng)常會(huì)陷入尋找意義和找不到意義的循環(huán)和陷阱里?,F(xiàn)在大概想明白一些了,持續(xù)輸出本身就是一種意義。

另外,這也是一種能力和核心價(jià)值的體現(xiàn)。

并且是一種很好的對(duì)自我的整理和鍛煉。

不管是為了自己而寫,還是為了在座的各位,反正,不輸出、不展示別人就不知道你有多厲害。

讓世界看到我的價(jià)值。

對(duì)了,為了讓自己寫起來更輕松愉快,我讓GPT4給我寫個(gè)初稿,然后在上面改。目前感覺GPT生成的初稿還不是很合我的心意,接下來多調(diào)試一些prompt讓它更聰明一些。又多了一種樂趣。

祝你心情愉快。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容