背景介紹
最近我需要通過FTP站點(diǎn)下載合作者提供的測(cè)序數(shù)據(jù),因此研究了一下怎么快速地從FTP站點(diǎn)下載文件。
測(cè)試的工具主要是ftp和lftp
什么是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ù)。
舉例:
- 使用默認(rèn)設(shè)置下載一個(gè)目錄中的所有文件:
lftp -c 'mget ftp://example.com/path/to/directory/*'
- 從一個(gè)目錄下載所有的
.txt文件,并將它們保存到本地的my_downloads目錄:
lftp -c 'mget -O my_downloads ftp://example.com/path/to/directory/*.txt'
- 使用排除和包含選項(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讓它更聰明一些。又多了一種樂趣。
祝你心情愉快。