情景介紹
平時工作中,我習慣使用rz從本地上傳文件到服務器,sz從服務器下載文件到本地,但對傳輸文件大小有限制,例如排查線上jvm的問題,需要生成了dump文件,可能有10G大,超過了限制,怎么下載呢?
拆分文件命令之split
語法
split [-<行數>][-l<行數>][-b<字節>][-C<字節>][要切割的文件][輸出文件名的前綴][-a<后綴長度>]
- 或-l :指定每多少行切成一個小文件 行數> 行數>
-b :指定每多少字節切成一個小文件,這里也可以指定K、M、G等單位 字節>
-C :與-b 類似,但在切割時會盡量維持每行的完整性 字節> 字節>
輸出文件名的前綴:設置拆分后文件的名稱前綴,split會自動在前綴后面加上編號,默認從aa開始
-a :默認后綴長度是2,即按 aa,ab,ac的順序排序 后綴長度>
split命令和cat命令可以完成上面的難題,排查線上問題的現場已經沒有了,所以為了演示,用dd命令(對dd命令不了解的也可以學下,因為這次重點介紹split,所以dd暫且不介紹)創建一個400MB的文件,文件名是adsearch.hprof,這里假設400MB的大小就超過了服務器的下載限制
dd if=/dev/zero bs=1024 count=409600 of=adsearch.hprof
如圖所示,創建了一個400MB的文件
那我把adsearch.hprof文件按100MB大小拆分,可以拆分成4個文件
split -b 100M adsearch.hprof
可以看到在執行完split命令后,目錄下生成了四個相同大小 xaa、xab、xac、xad四個100MB的小文件。因為我們沒有指定前綴,就采用了默認的前綴x,后面跟著aa、ab、ac、ad。我們也可以指定前綴,比如我把剛剛生成的四個小文件刪掉,用下面的命令重新切分下
split -b 100M adsearch.hprof adsearch-
合并文件之cat
把大文件切分后,我們就可以把小文件下載到本地,然后把他們再拼接起來
// 用通配符的形式,要保證該目錄下沒有其他以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命令把這些小文件重新拼接成大文件






