如何覆蓋從管道創建的 7z 存檔中的內容?
目的
我正在創建一個將數據庫表轉儲到壓縮
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 就知道你正在嘗試更新已經存在的內容。