linux split拆分文件

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 學完了,我們也可以和朋友一起欣賞驚險刺激的美國大片了!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容