15 分鐘之後,我要去朋友家聚會。我打算從我的桌上型電腦上把一部 700MB 大小的美國大片拷貝出來,帶到朋友家去看,可是我的兩個優盤都只有 512MB,這讓我如何是好?
別急,用 10 分鐘趕快來認識一下我們的 split 拆分小能手,一切問題將迎刃而解。當遇到大檔案而苦不堪言的時候,split 就會像天使一樣解救我們於水火之中。
合久必分
閒言少敘,我們現在就來介紹拆分的方法。先使用 dd 命令來生成一個 700MB 檔案來作為我們的拆分物件:
[[email protected] ~]$ dd if=/dev/zero bs=1024 count=700000 of=king_of_ring.avi
700000+0 records in
700000+0 records out
716800000 bytes (717 MB) copied, 12.9189 s, 55.5 MB/s
[[email protected] ~]$ ls -l king_of_ring.avi
-rw-r--r-- 1 root root 716800000 Apr 12 13:01 king_of_ring.avi
美國大片的檔案大小是 700MB,而我手邊僅有的兩個優盤,都是 512MB 大小的。我打算把檔案以 400MB 作為一個拆分單位,來進行拆分。這裡使用到了 split 的
-b
選項,來指定每個拆分檔案的大小:
[[email protected] ~]$ split -b 400M king_of_ring.avi
[[email protected] ~]$ ls -l
total 1400008
-rw-r--r-- 1 root root 716800000 Apr 12 13:01 king_of_ring.avi
-rw-r--r-- 1 root root 419430400 Apr 12 13:04 xaa
-rw-r--r-- 1 root root 297369600 Apr 12 13:04 xab
看!分身完畢!咦,怎麼多出了 xaa 和 xab 兩個檔案,這麼奇怪的名字?
是的,你沒看錯,在沒有明確指定拆分後檔案的命名方式的情況下,split 會預設採用 x 字元作為檔案字首,採用類似 aa、ab、ac 的字串依次作為檔案字尾。於是,就出現了我們上面看到的 xaa、xab 了。
從檔案大小來看,如我們所願,電影檔案的確被切割成了一個 400MB 的檔案、一個 300MB 的檔案,終於可以裝到兩個優盤裡了。
知其然,知其所以然
知道了拆分命令後,我們來一起學習一下 split 的命令格式和常用選項。
split 的作用很好描述,就是將檔案按照一定規則進行拆分。一般情況下,我們可以按照檔案大小來進行拆分,如果是文字檔案的話,還可以按照行數來進行拆分,預設是 1000 行作為一個拆分單位。
預設情況下,分割後的檔案的名稱會以 x 作為字首,以 aa、ab、ac 這樣的雙字母格式作為字尾,形成 xaa、xab 這樣的名稱格式。
我們來一起看看 split 的命令格式:
split [-b ][-C ][-][-l ][要切割的檔案][輸出檔名字首][-a ]
最常用的選項,都在這裡了:
-
-b<位元組>:指定按多少位元組進行拆分,也可以指定 K、M、G、T 等單位。
-
-<行數>或-l<行數>:指定每多少行要拆分成一個檔案。
-
輸出檔名字首:設定拆分後的檔案的名稱字首,split 會自動在字首後加上編號,預設從 aa 開始。
-
-a<字尾長度>:預設的字尾長度是 2,也就是按 aa、ab、ac 這樣的格式依次編號。
分久必合
完成了美國大片的拆分,我趕赴朋友家,開啟他的電腦,優盤插上,使用 cat 命令將拆分檔案 xaa 和 xab 合併成一個檔案,可以看出合併後的檔案和原始檔的大小是一致的:
[[email protected] ~]$ cat xaa xab > king_of_ring_merge.avi
[[email protected] ~]$ ls -l
total 2100012
-rw-r--r-- 1 root root 716800000 Apr 12 13:01 king_of_ring.avi
-rw-r--r-- 1 root root 716800000 Apr 12 13:07 king_of_ring_merge.avi
-rw-r--r-- 1 root root 419430400 Apr 12 13:04 xaa
-rw-r--r-- 1 root root 297369600 Apr 12 13:04 xab
對了,如果是在 Windows 下的話,我們要先執行 cmd,然後用 copy 命令來進行檔案的合併:
copy /b xaa + xab king_of_ring.avi
格式上和 Linux 有些區別,但原理是一樣的。
設定拆分檔案的名稱字首
上面例子中,我們沒有指定拆分檔案的名稱字首,結果拆分後的檔名都是 aa、ab 這樣的名稱,這樣的名稱既不達意也不美觀。
下面的例子,我們嘗試以 king_of_ring_part_ 作為拆分後檔案的名稱字首:
#我們指定了king_of_ring_part_字首
[[email protected] ~]$ split -b 400m king_of_ring.avi king_of_ring_part_
#可以看到, 檔名的可讀性提高了很多
[[email protected] ~]$ ls -l king*
-rw-r--r-- 1 root root 716800000 Feb 25 18:29 king_of_ring.avi
-rw-r--r-- 1 root root 419430400 Feb 25 19:24 king_of_ring_part_aa
-rw-r--r-- 1 root root 297369600 Feb 25 19:24 king_of_ring_part_ab
檔名的可讀性是不是提高了不少,從檔名稱就可以看出來是美國大片的拆分檔案啦。
設定數位字尾
如果大家看不慣以 aa、ab 這種字母作為檔案字尾,我們還可以通過-d選項來指定數位形式的檔案字尾:
#使用了-d選項
[[email protected] ~]$ split -b 400m -d king_of_ring.avi king_of_ring_part_
#字尾從原來的aa、ab變成了00、01
[[email protected] ~]$ ls -l king*
-rw-r--r-- 1 root root 716800000 Feb 25 18:29 king_of_ring.avi
-rw-r--r-- 1 root root 419430400 Feb 25 19:24 king_of_ring_part_00
-rw-r--r-- 1 root root 297369600 Feb 25 19:24 king_of_ring_part_01
對於中國人來說,數位形式的字尾,增加了檔名稱的可讀性。
按照行數進行拆分
前面我們講的是按照檔案大小(如 400MB)進行檔案拆分的方法,但是並非所有情況都適合於用檔案大小作為拆分單元。比如,我們希望把 /etc/passwd 檔案按照一個檔案 10 行記錄的方式進行拆分,又該怎麼操作呢?
#使用-N來指定拆分的行數,本例中為-10
[[email protected] ~]$ split -d -10 /etc/passwd my_passwd_
#可以看到拆分成功
[[email protected] ~]$ wc -l my_passwd_*
10 my_passwd_00
10 my_passwd_01
5 my_passwd_02
25 total
合併後的校驗不可少
需要注意的是,在通過網路來傳輸大檔案,或者在裝置之間複製大檔案的時候,可能會出現傳輸前後資料不一致的情況。
使用 split 來拆分大檔案僅僅是故事的開始,操作完畢後化零為整、完璧歸趙才是完美的結局。因此需要在合併檔案後進行檔案的完整性校驗,推薦使用 md5sum 來計算和比對前後兩個大檔案的 md5 值。
#對原先的檔案計算md5值
[[email protected] ~]$ md5sum king_of_ring.avi
eacff27bf2db99c7301383b7d8c1c07c king_of_ring.avi
#對合併後的檔案計算md5值, 並與原值進行比較
[[email protected] ~]$ md5sum king_of_ring_merge.avi
eacff27bf2db99c7301383b7d8c1c07c king_of_ring_merge.avi
如果前後一致,那麼恭喜你,檔案合併成功!
好了,split 學完了,我們也可以和朋友一起欣賞驚險刺激的美國大片了!