平時工做中,我習慣使用rz從本地上傳文件到服務器,sz從服務器下載文件到本地,但對傳輸文件大小有限制,例如排查線上jvm的問題,須要生成了dump文件,可能有10G大,超過了限制,怎麼下載呢?git
語法bash
split [-<行數>][-l<行數>][-b<字節>][-C<字節>][要切割的文件][輸出文件名的前綴][-a<後綴長度>]複製代碼
- <行數> 或-l <行數> :指定每多少行切成一個小文件 服務器
-b <字節> :指定每多少字節切成一個小文件,這裏也能夠指定K、M、G等單位 jvm
-C <字節> :與-b <字節> 相似,但在切割時會盡可能維持每行的完整性 spa
輸出文件名的前綴:設置拆分後文件的名稱前綴,split會自動在前綴後面加上編號,默認從aa開始code
-a <後綴長度> :默認後綴長度是2,即按 aa,ab,ac的順序排序 cdn
split命令和cat命令能夠完成上面的難題,排查線上問題的現場已經沒有了,因此爲了演示,用dd命令(對dd命令不瞭解的也能夠學下,由於此次重點介紹split,因此dd暫且不介紹)建立一個400MB的文件,文件名是adsearch.hprof,這裏假設400MB的大小就超過了服務器的下載限制blog
dd if=/dev/zero bs=1024 count=409600 of=adsearch.hprof複製代碼
如圖所示,建立了一個400MB的文件排序
那我把adsearch.hprof文件按100MB大小拆分,能夠拆分紅4個文件md5
split -b 100M adsearch.hprof複製代碼
能夠看到在執行完split命令後,目錄下生成了四個相同大小 xaa、xab、xac、xad四個100MB的小文件。由於咱們沒有指定前綴,就採用了默認的前綴x,後面跟着aa、ab、ac、ad。咱們也能夠指定前綴,好比我把剛剛生成的四個小文件刪掉,用下面的命令從新切分下
split -b 100M adsearch.hprof adsearch-複製代碼
把大文件切分後,咱們就能夠把小文件下載到本地,而後把他們再拼接起來
// 用通配符的形式,要保證該目錄下沒有其餘以adsearch-a爲前綴的文件
cat adsearch-a* > adsearch.hprof
// 或者指定文件進行拼接
cat adsearch-aa adsearch-ab adsearch-ac adsearch-ad > adsearch.hprof複製代碼
備註
上面的操做我是在win本上的gitbash操做的,有cat命令
那若是沒有安裝gitbash只有cmd呢?
可使用copy /b 命令來拼接,其中 /b 表明指定以二進制格式進行復制
copy /b adsearch-aa + adsearch-ab + adsearch-ac + adsearch-ad adsearch.hprof複製代碼
通過拆分-合併後,兩個文件同樣嗎?這是咱們主要關心的問題,咱們對文件作一個md5,看結果是否相等,就能夠判斷文件是否同樣了
原始文件的md5
合併後文件的md5(gitbash)
合併後文件的md5(cmd)
通過對先後文件的md5值比價,結果一致,說明咱們的操做沒有問題
當咱們下載或上傳相對較大的文件時,可使用split把大文件拆分紅小文件,而後用cat命令把這些小文件從新拼接成大文件