首頁 > 軟體

在 Linux 中分割和重組檔案

2020-06-16 17:08:52

非常有用的 csplit 命令可以將單個檔案分割成多個檔案。Carla Schroder 解釋說。

Linux 有幾個用於分割檔案的工具程式。那麼你為什麼要分割檔案呢?一個用例是將大檔案分割成更小的尺寸,以便它適用於比較小的儲存媒介,比如 U 盤。當您遇到 FAT32(最大檔案大小為 4GB),且您的檔案大於此時,通過 U 盤傳輸檔案也是一個很好的技巧。另一個用例是加速網路檔案傳輸,因為小檔案的並行傳輸通常更快。

我們將學習如何使用 csplitsplitcat 來重新整理檔案,然後再將檔案合併在一起。這些操作在任何檔案型別下都有用:文字、圖片、音訊檔、ISO 映象檔案等。

使用 csplit 分割檔案

csplit 是這些有趣的小命令中的一個,它永遠伴你左右,一旦開始用它就離不開了。csplit 將單個檔案分割成多個檔案。這個範例演示了最簡單的使用方法,它將檔案 foo.txt 分為三個檔案,以行號 17 和 33 作為分割點:

  1. $ csplit foo.txt 1733
  2. 2591
  3. 3889
  4. 2359

csplit 在當前目錄下建立了三個新檔案,並以位元組為單位列印出新檔案的大小。預設情況下,每個新檔名為 xx_nn

  1. $ ls
  2. xx00
  3. xx01
  4. xx02

您可以使用 head 命令檢視每個新檔案的前十行:

  1. $ head xx*
  2. ==> xx00 <==
  3. FooFile
  4. by CarlaSchroder
  5. Foo text
  6. Foo subheading
  7. More foo text
  8. ==> xx01 <==
  9. Foo text
  10. Foo subheading
  11. More foo text
  12. ==> xx02 <==
  13. Foo text
  14. Foo subheading
  15. More foo text

如果要將檔案分割成包含相同行數的多個檔案怎麼辦?可以指定行數,然後將重複次數放在在花括號中。此範例重複分割 4 次,並將剩下的轉儲到最後一個檔案中:

  1. $ csplit foo.txt 5{4}
  2. 57
  3. 1488
  4. 249
  5. 1866
  6. 3798

您可以使用星號萬用字元來告訴 csplit 盡可能多地重複分割。這聽起來很酷,但是如果檔案不能等分,則可能會失敗(LCTT 譯註:低版本的 csplit 不支援此引數):

  1. $ csplit foo.txt 10{*}
  2. 1545
  3. 2115
  4. 1848
  5. 1901
  6. csplit:'10': line number out of range on repetition 4
  7. 1430

預設的行為是刪除發生錯誤時的輸出檔案。你可以用 -k 選項來解決這個問題,當有錯誤時,它就不會刪除輸出檔案。另一個行為是每次執行 csplit 時,它將覆蓋之前建立的檔案,所以你需要使用新的檔名來分別儲存它們。使用 --prefix= _prefix_ 來設定一個不同的檔案字首:

  1. $ csplit -k --prefix=mine foo.txt 5{*}
  2. 57
  3. 1488
  4. 249
  5. 1866
  6. 993
  7. csplit:'5': line number out of range on repetition 9
  8. 437
  9. $ ls
  10. mine00
  11. mine01
  12. mine02
  13. mine03
  14. mine04
  15. mine05

選項 -n 可用於改變對檔案進行編號的數位位數(預設是 2 位):

  1. $ csplit -n 3--prefix=mine foo.txt 5{4}
  2. 57
  3. 1488
  4. 249
  5. 1866
  6. 1381
  7. 3798
  8. $ ls
  9. mine000
  10. mine001
  11. mine002
  12. mine003
  13. mine004
  14. mine005

csplit 中的 “c” 是上下文(context)的意思。這意味著你可以根據任意匹配的方式或者巧妙的正規表示式來分割檔案。下面的例子將檔案分為兩部分。第一個檔案在包含第一次出現 “fie” 的前一行處結束,第二個檔案則以包含 “fie” 的行開頭。

  1. $ csplit foo.txt /fie/

在每次出現 “fie” 時分割檔案:

  1. $ csplit foo.txt /fie/{*}

在 “fie” 前五次出現的地方分割檔案:

  1. $ csplit foo.txt /fie/{5}

僅當內容以包含 “fie” 的行開始時才複製,並且省略前面的所有內容:

  1. $ csplit myfile %fie%

 

將檔案分割成不同大小

splitcsplit 類似。它將檔案分割成特定的大小,當您將大檔案分割成小的多媒體檔案或者使用網路傳送時,這就非常棒了。預設的大小為 1000 行:

  1. $ split foo.mv
  2. $ ls-hl
  3. 266KAug2116:58 xaa
  4. 267KAug2116:58 xab
  5. 315KAug2116:58 xac
  6. [...]

它們分割出來的大小相似,但你可以指定任何你想要的大小。這個例子中是 20M 位元組:

  1. $ split-b 20M foo.mv

尺寸單位縮寫為 K,M,G,T,P,E,Z,Y(1024 的冪)或者 KB,MB,GB 等等(1000 的冪)。

為檔名選擇你自己的字首和字尾:

  1. $ split-a 3--numeric-suffixes=9--additional-suffix=mine foo.mv SB
  2. 240KAug2117:44 SB009mine
  3. 214KAug2117:44 SB010mine
  4. 220KAug2117:44 SB011mine

-a 選項控制編號的數位位置。--numeric-suffixes 設定編號的開始值。預設字首為 x,你也可以通過在檔名後輸入它來設定一個不同的字首。

 

將分割後的檔案合併

你可能想在某個時候重組你的檔案。常用的 cat 命令就用在這裡:

  1. $ cat SB0*> foo2.txt

範例中的星號萬用字元將匹配到所有以 SB0 開頭的檔案,這可能不會得到您想要的結果。您可以使用問號萬用字元進行更精確的匹配,每個字元使用一個問號:

  1. $ cat SB0??????> foo2.txt

和往常一樣,請查閱相關的手冊和資訊頁面以獲取完整的命令選項。


via: https://www.linux.com/learn/intro-to-linux/2017/8/splitting-and-re-assembling-files-linux

作者:CARLA SCHRODER 譯者:firmianay 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-08/146573.htm


IT145.com E-mail:sddin#qq.com