檔案的聯合解密和解壓縮

檔案的聯合解密和解壓縮

我有一個加密文件,例如file.zip.gpg.

解密是gpg --output file.zip --decrypt file.zip.gpg使用之後使用並解壓縮存檔內容來完成的7z(a) x file.zip

第一個命令顯然創建了一個(臨時)檔案。我想知道這兩個命令是否可以組合成一個命令(管道?)以防止在磁碟上建立臨時檔案。

我試過

gpg --decrypt file.zip.gpg | 7z x -si

7z輸出出現在gpg要求輸入密碼之前:Extracting archive: ERROR: Can not open the file as archive

答案1

你沒有標記,但檔案名稱包含.zip,所以我認為解密後它確實是一個 zip 檔案。

這個答案:

ZIP 檔案格式在存檔末尾包含一個目錄(索引)。該目錄說明了每個檔案在存檔中的位置,因此允許快速、隨機訪問,而無需讀取整個存檔。

當嘗試透過管道讀取 ZIP 存檔時,這似乎會帶來問題,因為直到最後才存取索引,因此在檔案完全讀取且不再可用之前無法正確提取各個成員。因此,當透過管道提供存檔時,大多數 ZIP 解壓縮器都會失敗,這似乎並不奇怪。

存檔末尾的目錄並不是存檔中儲存檔案元資訊的唯一位置。此外,出於冗餘目的,各個條目還在本地文件頭中包含此資訊。

儘管並非每個 ZIP 解壓縮器都會在索引不可用時使用本地文件頭,但tarcpio前端libarchive(又名bsdtarbsdcpio)在通過管道讀取時可以並且將會這樣做,[...]

bsdtar在我的 Debian 9 中, (來自包)的解決方案libarchive-tools有效:

gpg --decrypt file.zip.gpg | bsdtar -xvf-

其他答案提供了其他解決方案。其中一些確實變相使用臨時檔案(例如=( … )在 zsh 中),有些則不使用(例如busybox unzip -,但這個對我不起作用)。


如果格式是 7z 而不是 zip,那麼問題也會類似。比較這個線程:

試圖通過管道7za

我正在嘗試7za在 C++ 程式中的管道中運行。 […]

如果我嘗試在命令列上執行此操作,也會發生同樣的情況。

7za e -an -si -so < filename.7z >/dev/null
ERROR:
Can not open the file as archive

E_NOTIMPL

Igor Pavlov(7-zip 的創作者)的答案是:

7-zip 需要對 7z 檔案進行「查找」操作。所以你不能使用-si從 7z 檔案中提取。

該日期為 2016 年 3 月 30 日。我的測試和變更日誌表明該聲明在 2019 年仍然bsdtar有效Error seeking in stdin。我猜是7z格式真的需要一個可尋找的文件。

相關內容