split 分割大型檔案
在 Linux 系統管理與資料處理的日常工作中,我們經常會遇到需要處理大型檔案的情境。無論是備份巨大的日誌檔、傳輸超過郵件附件限制的照片,還是將資料庫匯出的 CSV 檔拆分以便於後續處理,split 指令都是最基礎且強大的工具之一。它雖然功能看似單一,但透過靈活的選項配置,能精準地將單一檔案切割成多個小檔案,解決各種實際應用上的瓶頸。
這篇文章將深入解析 split 指令的核心用法,涵蓋按大小分割、按行數分割以及自訂檔名後綴等實戰技巧,幫助你輕鬆應對大型檔案的處理需求。
基本語法與常用選項
split 指令的基本語法非常直觀:
split [選項] [輸入檔案] [輸出檔名前綴]
若未指定輸出檔名前綴,預設會生成名為 xaa, xb, xc ... 的檔案。通常我們會自訂前綴,例如 part_,以便識別。以下是幾個最實用的選項:
-b:指定每個分割檔案的大小(可帶單位如 k, m, g)。-l:指定每個分割檔案的行數。-d:使用數字作為檔名後綴(預設為字母),對於大量分割時更為整潔。-a:設定後綴的長度(當分割檔案數量超過 26 個時特別有用)。
實戰範例一:按文件大小分割
這是最常見的需求,例如將一個 1GB 的日誌檔拆分成多個 100MB 的檔案,方便透過 FTP 或雲端儲存空間上傳。
首先,我們建立一個測試用的大檔案(約 50MB):
dd if=/dev/urandom of=large_file.bin bs=1M count=50
接著,使用 -b 選項將其分割成 10MB 的檔案,並加上數字後綴:
split -b 10M -d large_file.bin part_
執行後,你會發現目錄中出現了 part_00, part_01, part_02, part_03, part_04 這五個檔案。注意,我們使用了 -d 選項並搭配預設長度,因此後綴自動補零為兩位數(00-04)。
如果分割檔案數量超過 26 個(即超過單個字母 a-z 的範圍),預設的字母後綴會失效。此時必須使用 -d 搭配 -a 來指定後綴長度。例如,若要產生最多 1000 個檔案,後綴需為三位數:
split -b 1M -d -a 3 large_file.bin chunk_
這將生成 chunk_000, chunk_001 ... 直到 chunk_999。
實戰範例二:按行數分割
對於純文字檔(如日誌檔、CSV 檔),按行數分割往往比按大小分割更具邏輯性,因為它能確保每個小檔案包含完整的記錄行,不會出現中間斷行的情況。
假設我們有一個包含 1000 行的文字檔 data.txt:
seq 1000 > data.txt
若要每 100 行切一個檔案:
split -l 100 -d data.txt log_part_
執行結果會產生 log_part_00 到 log_part_09 共十個檔案。每個檔案都嚴格包含 100 行(最後一個檔案可能少於 100 行,若總行數不是 100 的倍數)。
常見問題與注意事項
1. 分割後的檔案如何合併?
許多新手會擔心分割後如何還原。其實,Linux 提供了 cat 指令可以輕鬆合併檔案。只要按照檔案名稱的順序進行合併,即可還原原始檔案。
cat part_* > restored_file.bin
或者使用更明確的排序方式:
cat part_00 part_01 part_02 part_03 part_04 > restored_file.bin
驗證方法:可以使用 md5sum 比較原始檔與合併後的檔是否一致,確保資料完整性。
2. 單位大小寫敏感嗎?
在 split 指令中,大小寫通常是有區別的。
k代表 1024 位元組(KiB)m代表 1048576 位元組(MiB)g代表 1073741824 位元組(GiB)
若使用大寫 K, M, G,在某些版本或系統中可能代表 1000 進位(KB, MB, GB),這會導致分割大小與預期不符。因此,強烈建議使用小寫 k, m, g 以符合 POSIX 標準及大多數 Linux 發行版(如 Ubuntu 22.04 / Debian 12)的預設行為。
小結
split 指令雖然是 Linux 中的小型工具,但在處理大型檔案時卻發揮著舉足輕重的作用。透過理解 -b(大小)與 -l(行數)的差異,以及善用 -d 和 -a 來管理檔名順序,你可以輕鬆應對從日誌分析到資料備份的各種挑戰。記住,分割只是第一步,搭配 cat 進行還原,以及使用 md5sum 確保完整性,才是完整且專業的資料處理流程。下次遇到檔案過大時,不妨試試看 split,它會是你命令行工具箱中不可或缺的利器。