Linux

拆分文件後再次加入文件的最佳方法是什麼?

  • September 5, 2019

如果我有一個大文件並且需要將其拆分為 100 兆字節的塊,我會這樣做

split -b 100m myImage.iso

這通常會給我類似的東西

xaa
xab
xac
xad

為了讓它們重新組合在一起,我一直在使用

cat x* > myImage.iso

似乎應該有一種比閱讀一組文件中的每一行程式碼cat並將輸出重定向到新文件更有效的方法。就像只打開兩個文件,EOF從第一個文件中刪除標記並連接它們的方式一樣 - 無需瀏覽所有內容。

Windows/DOS 有一個用於二進製文件的複制命令。幫助中提到該命令旨在能夠組合多個文件。它使用以下語法:(/b用於二進制模式)

copy /b file1 + file2 + file3 outputfile

在 Linux 上加入大文件是否有比 cat 類似或更好的方法?

更新

看來這cat實際上是加入文件的正確方式和最佳方式。很高興知道我一直在使用正確的命令 :) 感謝大家的回饋。

這正是**cat**為之而生的。由於它是最古老的 GNU 工具之一,我認為任何其他工具都不太可能更快/更好地做到這一點。而且它不是管道- 它只是重定向輸出。

在引擎蓋下

沒有比複製第一個文件,然後複製第二個文件更有效的方法了,依此類推。DOScopycat這樣做。

每個文件都獨立於磁碟上的其他文件儲存。幾乎每個旨在將數據儲存在類磁碟設備上的文件系統都是按塊操作的。下面是對所發生情況的高度簡化表示:磁碟被劃分為 1kB 的塊,對於每個文件,作業系統儲存組成它的塊列表。大多數文件不是整數塊長,因此最後一個塊僅被部分佔用。在實踐中,文件系統有許多優化,例如在多個文件之間共享最後一個部分塊或儲存“塊 46798 到 47913”而不是“塊 46798,塊 46799,……”。當作業系統需要創建一個新文件時,它會尋找空閒塊。塊不必是連續的:如果只有塊 4、5、98 和 178 是空閒的,你仍然可以儲存一個 4kB 的文件。

您可以在中間文件中支持部分塊,但這會增加相當大的複雜性,特別是在非順序訪問文件時:要跳轉到第 10340 個字節,您不能再跳轉到第 11 個塊的第 100 個字節,您將擁有檢查每個中間塊的長度。

考慮到塊的使用,你不能只連接兩個文件,因為通常第一個文件在塊中間結束。當然,您可能有一個特殊情況,但前提是您想在連接時刪除這兩個文件。對於罕見的操作,這將是一個高度具體的處理。這種特殊處理不會獨立存在,因為在典型的文件系統上,許多文件同時被訪問。因此,如果要添加優化,則需要仔細考慮:如果其他程序正在讀取所涉及的文件之一,會發生什麼?如果有人在連接 A 和 C 時嘗試連接 A 和 B,會發生什麼情況?等等。總而言之,這種罕見的優化將是一個巨大的負擔。

總而言之,如果不在其他地方做出重大犧牲,就無法提高連接文件的效率。這不值得。

關於拆分和加入

split並且cat是拆分和連接文件的簡單方法。split負責生成按字母順序命名的文件,以便cat *加入。

for join的一個缺點cat是它對常見的故障模式不健壯。如果其中一個文件被截斷或失去,cat不會抱怨,您只會得到損壞的輸出。

有一些壓縮實用程序可以生成多部分存檔,例如zipsplitrar -v. 它們不是很統一,因為它們除了拆分之外還壓縮和打包(將多個文件組合成一個文件)(相反,除了加入之外,它們還解壓縮和解壓縮)。但是它們很有用,因為它們可以驗證您是否擁有所有元件,並且這些元件是完整的。

引用自:https://unix.stackexchange.com/questions/24630