Linux

將文件添加到 tbz 文件

  • February 15, 2018

我正在尋找一種更新數千個 .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 usingcat不會產生有效的 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在嘗試從以這種方式創建的文件中讀取時使用它,它可能會很有用。

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