http://c.biancheng.net/linux/split.html
15 分鐘之后,我要去朋友家聚會。我打算從我的臺式機上把一部 700MB 大小的美國大片拷貝出來,帶到朋友家去看,可是我的兩個優盤都只有 512MB,這讓我如何是好?
別急,用 10 分鐘趕快來認識一下我們的 split 拆分小能手,一切問題將迎刃而解。當遇到大文件而苦不堪言的時候,split 就會像天使一樣解救我們于水火之中。
合久必分
閑言少敘,我們現在就來介紹拆分的方法。先使用 dd 命令來生成一個 700MB 文件來作為我們的拆分對象:
700000+0 records in
700000+0 records out
716800000 bytes (717 MB) copied, 12.9189 s, 55.5 MB/s
[root@roclinux ~]$ 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選項,來指定每個拆分文件的大小:
[root@roclinux ~]$ 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 合并成一個文件,可以看出合并后的文件和源文件的大小是一致的:
[root@roclinux ~]$ 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_前綴
[root@roclinux ~]$ split -b 400m king_of_ring.avi king_of_ring_part_
可以看到, 文件名的可讀性提高了很多
-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選項
[root@roclinux ~]$ split -b 400m -d king_of_ring.avi king_of_ring_part_
后綴從原來的aa、ab變成了00、01
-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
[root@roclinux ~]$ split -d -10 /etc/passwd my_passwd_
可以看到拆分成功
10 my_passwd_00
10 my_passwd_01
5 my_passwd_02
25 total
合并后的校驗不可少
需要注意的是,在通過網絡來傳輸大文件,或者在設備之間復制大文件的時候,可能會出現傳輸前后數據不一致的情況。
使用 split 來拆分大文件僅僅是故事的開始,操作完畢后化零為整、完璧歸趙才是完美的結局。因此需要在合并文件后進行文件的完整性校驗,推薦使用 md5sum 來計算和比對前后兩個大文件的 md5 值。
對原先的文件計算md5值
eacff27bf2db99c7301383b7d8c1c07c king_of_ring.avi
對合并后的文件計算md5值, 并與原值進行比較
eacff27bf2db99c7301383b7d8c1c07c king_of_ring_merge.avi
如果前后一致,那么恭喜你,文件合并成功!
好了,split 學完了,我們也可以和朋友一起欣賞驚險刺激的美國大片了!