在Linux中分割和重組文件
非常有用的 csplit 命令可以將單個文件分割成多個文件。Carla Schroder 解釋說。
Linux 有幾個用于分割文件的工具程序。那么你為什么要分割文件呢?一個用例是將大文件分割成更小的尺寸,以便它適用于比較小的存儲介質(zhì),比如 U 盤。當(dāng)您遇到 FAT32(***文件大小為 4GB),且您的文件大于此時,通過 U 盤傳輸文件也是一個很好的技巧。另一個用例是加速網(wǎng)絡(luò)文件傳輸,因為小文件的并行傳輸通常更快。
我們將學(xué)習(xí)如何使用 csplit,split 和 cat 來重新整理文件,然后再將文件合并在一起。這些操作在任何文件類型下都有用:文本、圖片、音頻文件、ISO 鏡像文件等。
使用 csplit 分割文件
csplit 是這些有趣的小命令中的一個,它永遠(yuǎn)伴你左右,一旦開始用它就離不開了。csplit 將單個文件分割成多個文件。這個示例演示了最簡單的使用方法,它將文件 foo.txt 分為三個文件,以行號 17 和 33 作為分割點:
- $ csplit foo.txt 17 33
- 2591
- 3889
- 2359
csplit 在當(dāng)前目錄下創(chuàng)建了三個新文件,并以字節(jié)為單位打印出新文件的大小。默認(rèn)情況下,每個新文件名為 xx_nn:
- $ ls
- xx00
- xx01
- xx02
您可以使用 head 命令查看每個新文件的前十行:
- $ head xx*
- ==> xx00 <==
- Foo File
- by Carla Schroder
- Foo text
- Foo subheading
- More foo text
- ==> xx01 <==
- Foo text
- Foo subheading
- More foo text
- ==> xx02 <==
- Foo text
- Foo subheading
- More foo text
如果要將文件分割成包含相同行數(shù)的多個文件怎么辦?可以指定行數(shù),然后將重復(fù)次數(shù)放在在花括號中。此示例重復(fù)分割 4 次,并將剩下的轉(zhuǎn)儲到***一個文件中:
- $ csplit foo.txt 5 {4}
- 57
- 1488
- 249
- 1866
- 3798
您可以使用星號通配符來告訴 csplit 盡可能多地重復(fù)分割。這聽起來很酷,但是如果文件不能等分,則可能會失敗(LCTT 譯注:低版本的 csplit 不支持此參數(shù)):
- $ csplit foo.txt 10 {*}
- 1545
- 2115
- 1848
- 1901
- csplit: '10': line number out of range on repetition 4
- 1430
默認(rèn)的行為是刪除發(fā)生錯誤時的輸出文件。你可以用 -k 選項來解決這個問題,當(dāng)有錯誤時,它就不會刪除輸出文件。另一個行為是每次運行 csplit 時,它將覆蓋之前創(chuàng)建的文件,所以你需要使用新的文件名來分別保存它們。使用 --prefix= _prefix_ 來設(shè)置一個不同的文件前綴:
- $ csplit -k --prefix=mine foo.txt 5 {*}
- 57
- 1488
- 249
- 1866
- 993
- csplit: '5': line number out of range on repetition 9
- 437
- $ ls
- mine00
- mine01
- mine02
- mine03
- mine04
- mine05
選項 -n 可用于改變對文件進(jìn)行編號的數(shù)字位數(shù)(默認(rèn)是 2 位):
- $ csplit -n 3 --prefix=mine foo.txt 5 {4}
- 57
- 1488
- 249
- 1866
- 1381
- 3798
- $ ls
- mine000
- mine001
- mine002
- mine003
- mine004
- mine005
csplit 中的 “c” 是上下文(context)的意思。這意味著你可以根據(jù)任意匹配的方式或者巧妙的正則表達(dá)式來分割文件。下面的例子將文件分為兩部分。***個文件在包含***次出現(xiàn) “fie” 的前一行處結(jié)束,第二個文件則以包含 “fie” 的行開頭。
- $ csplit foo.txt /fie/
在每次出現(xiàn) “fie” 時分割文件:
- $ csplit foo.txt /fie/ {*}
在 “fie” 前五次出現(xiàn)的地方分割文件:
- $ csplit foo.txt /fie/ {5}
僅當(dāng)內(nèi)容以包含 “fie” 的行開始時才復(fù)制,并且省略前面的所有內(nèi)容:
- $ csplit myfile %fie%
將文件分割成不同大小
split 與 csplit 類似。它將文件分割成特定的大小,當(dāng)您將大文件分割成小的多媒體文件或者使用網(wǎng)絡(luò)傳送時,這就非常棒了。默認(rèn)的大小為 1000 行:
- $ split foo.mv
- $ ls -hl
- 266K Aug 21 16:58 xaa
- 267K Aug 21 16:58 xab
- 315K Aug 21 16:58 xac
- [...]
它們分割出來的大小相似,但你可以指定任何你想要的大小。這個例子中是 20M 字節(jié):
- $ split -b 20M foo.mv
尺寸單位縮寫為 K,M,G,T,P,E,Z,Y(1024 的冪)或者 KB,MB,GB 等等(1000 的冪)。
為文件名選擇你自己的前綴和后綴:
- $ split -a 3 --numeric-suffixes=9 --additional-suffix=mine foo.mv SB
- 240K Aug 21 17:44 SB009mine
- 214K Aug 21 17:44 SB010mine
- 220K Aug 21 17:44 SB011mine
-a 選項控制編號的數(shù)字位置。--numeric-suffixes 設(shè)置編號的開始值。默認(rèn)前綴為 x,你也可以通過在文件名后輸入它來設(shè)置一個不同的前綴。
將分割后的文件合并
你可能想在某個時候重組你的文件。常用的 cat 命令就用在這里:
- $ cat SB0* > foo2.txt
示例中的星號通配符將匹配到所有以 SB0 開頭的文件,這可能不會得到您想要的結(jié)果。您可以使用問號通配符進(jìn)行更精確的匹配,每個字符使用一個問號:
- $ cat SB0?????? > foo2.txt
和往常一樣,請查閱相關(guān)的手冊和信息頁面以獲取完整的命令選項。