將文件添加到 tbz 文件
我正在尋找一種更新數千個 .tbz 存檔文件的方法,因此我將使用 shell 腳本來執行此操作。我需要為每個文件添加一個文件。
我的問題是,有沒有一種更快的方法來做到這一點,而無需提取每個 tbz 的內容,然後使用包含的 tar 中包含的新文件重新壓縮?命令會是什麼樣子?
謝謝
雖然
tar
可以將文件添加到已經存在的存檔中,但它不能被壓縮。您將不得不bunzip2
壓縮存檔,留下一個標準的 tarball。然後,您可以使用tar
的功能將文件添加到現有存檔,然後使用bzip2
.從手冊:
-r Like -c, but new entries are appended to the archive. Note that this only works on uncompressed archives stored in regular files. The -f option is required.
另一個答案是正確的:如果不解壓縮,您無法正確更新壓縮的 tar 存檔。GNU tar 文件對此進行了提示,並且嘗試更新失敗並顯示明確的錯誤消息:
$ tar --concatenate --file=cat.tar.bz2 two.tar.bz2 tar: Cannot update compressed archives tar: Error is not recoverable: exiting now
*但是,*如果您對不需要解壓縮的骯髒的工作解決方案感興趣,我可以根據以下觀察提供一個:
- 支持使用附加 bzip2 流
cat
並生成有效的 bzip2 流(gzip 也是如此);- 附加 tars using
cat
不會產生有效的 tar 文件,這就是該--concatenate
選項存在的原因,但我們可以要求 tar 假裝它是有效的:想要或嘗試使用 cat 連接兩個檔案而不是使用
--concatenate
操作對您來說似乎更直覺;畢竟,cat 是組合文件的實用程序。但是, tar 檔案包含一個文件結束標記,如果要將連接的檔案作為一個檔案正確讀取,則必須刪除該標記。
--concatenate
在附加每個新存檔之前從目標存檔中刪除存檔結束標記。如果您使用 cat 組合檔案,結果將不是有效的 tar 格式檔案。如果您需要從使用 cat 實用程序添加到的存檔中檢索文件,請使用--ignore-zeros
(-i
) 選項。基於這些知識,我們可以做,例如:
cat {one,two}.tar.bz2 >combined.tar.bz2
正如上面的文件片段所解釋的,這會導致無效的 tar 文件,但使用
--ignore-zeros
,它仍然可以被完全讀取:## Show contents of `one.tar.bz2' $ tar tf one.tar.bz2 a b ## Show contents of `two.tar.bz2' $ tar tf two.tar.bz2 c ## Show contents of `combined.tar.bz2', bypassing the bad format $ tar tif combined.tar.bz2 a b c
請注意上面如何列出原始兩個檔案中的所有三個文件,而省略
-i
(正確)僅列出第一個原始檔案中的文件:$ tar tf combined.tar.bz2 a b
再一次,這只不過是一個骯髒的技巧,但如果您同時控制寫入端和讀取端並且可以確保
-i
在嘗試從以這種方式創建的文件中讀取時使用它,它可能會很有用。