7z

如何覆蓋從管道創建的 7z 存檔中的內容?

  • August 20, 2017

目的

我正在創建一個將數據庫表轉儲到壓縮7z文件的函式。的輸出通過開關mysqldump傳送到。在結果文件中應該始終只有一個文件和一個文件。生成的文件有一個名稱,例如. 如果我的函式被呼叫並且存檔已經存在,它不會重新創建存檔,除非. 如果,它會刪除存檔並再次壓縮。有沒有辦法使用 7zr 開關實現此文件刪除並再次存檔壓縮?7zr``-si``7z``database_table.sql.7z``force=TRUE``force=TRUE``rm database.sql.7z``rm

正如我在上面所寫的, 的輸出通過開關mysqldump傳送到,因此沒有文件“磁碟上的文件”可以與 更新開關文件中解釋的“存檔中的文件”進行比較。7zr``-si``-u

問題

我的問題是,如果存檔文件已經存在,則將內容添加到現有存檔中,而不是覆蓋所有存檔內容。例如,如果我創建一個虛擬存檔:

$ echo "Hello"| 7zr a -si hello.txt.7z
Creating archive hello.txt.7z

Compressing  [Content]      

Everything is Ok

我可以再次執行該命令:

$ echo "Hello"| 7zr a -si hello.txt.7z
Updating archive hello.txt.7z

Compressing  [Content]      

Everything is Ok

但是 7zr 第三次返回錯誤:

$ echo "Hello"| 7zr a -si hello.txt.7z

Error:
Duplicate filename:
hello.txt
hello.txt

我的備份解決方案是在重新創建存檔之前簡單地刪除它。事實上,我想覆蓋存檔內容,但覆蓋開關-ao僅適用於提取,不適用於創建存檔。我可以為此使用哪個7zr 開關?

“覆蓋”有點含糊,但假設您要更新現有存檔,使其與最初創建存檔的目錄中的更改同步。使用u開關,然後從本頁的第三個表中找出魔術程式碼https://sevenzip.osdn.jp/chm/cmdline/switches/update.htm

如果我從這樣的目錄foo創建存檔:

7zr a foo.7z foo

然後我可以將文件添加、更改或刪除(“同步”)帶到foo中:

7zr u foo.7z -up1q0r2y2 foo

根據您感興趣的更改,魔術程式碼可能會略有不同(請參閱該頁面上的第一個表格)。

相當神秘。

**編輯:**經過一番反复,似乎 OP 要求從 STDIN 填充存檔,並且每次都只想覆蓋現有的存檔內容。以下解決了這個問題。

您需要指定與您的數據相關聯的“文件名”。這是通過在-si標誌後面加上一個名稱來完成的(之間沒有空格):

<input> | 7zr a -sifoo foo.7z

此命令適用於存檔的初始創建以及更新。

背景:如此處所示https://sevenzip.osdn.jp/chm/cmdline/switches/stdin.htm

如果未指定 file_name,則數據將不帶名稱儲存

因此 7zr 將無法知道現有內容與後續輸入相關聯。這就是為什麼您每次更新時都會看到一個新的存檔條目。一旦你給你的輸入命名,7zr 就知道你正在嘗試更新已經存在的內容。

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