ファイルの復号化と解凍の組み合わせ

ファイルの復号化と解凍の組み合わせ

のような暗号化されたファイルがありますfile.zip.gpg

復号化は を使用して行われgpg --output file.zip --decrypt file.zip.gpg、その後、アーカイブの内容を解凍します7z(a) x file.zip

最初のコマンドは明らかに (一時) ファイルを作成します。ディスク上に一時ファイルが作成されないように、両方のコマンドを 1 つのコマンド (パイプ?) に組み合わせることができるかどうかを知りたいです。

私は試した

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

ただし、パスフレーズを要求する7z前に出力が表示されます。gpgExtracting archive: ERROR: Can not open the file as archive

答え1

タグ付けされていませんですが、ファイル名に が含まれている.zipため、復号化後は実際には zip ファイルであると想定されます。

見るこの答え:

ZIP ファイル形式には、アーカイブの最後にディレクトリ (インデックス) が含まれます。このディレクトリには、アーカイブ内の各ファイルの場所が示されており、アーカイブ全体を読み取らなくても、すばやくランダムにアクセスできます。

これは、パイプを介して ZIP アーカイブを読み取ろうとするときに問題を引き起こすと思われます。インデックスは最後までアクセスされないため、ファイルが完全に読み取られて使用できなくなるまで、個々のメンバーを正しく抽出できません。そのため、アーカイブがパイプを介して提供されると、ほとんどの ZIP 解凍プログラムが単に失敗するのはあまり意外ではないようです。

アーカイブの末尾のディレクトリは、アーカイブ内でファイルのメタ情報が保存される唯一の場所ではありません。また、冗長性のために、個々のエントリにもローカル ファイル ヘッダーにこの情報が含まれています。

すべての ZIP 解凍プログラムがインデックスが利用できない場合にローカル ファイル ヘッダーを使用するわけではありませんが、tarおよびcpioのフロントエンドlibarchive(別名bsdtarおよびbsdcpio) はパイプを介して読み取るときにローカル ファイル ヘッダーを使用できます。[…]

bsdtar私の Debian 9 では、 (libarchive-toolsパッケージからの)ソリューションが機能します:

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

他の回答では、他の解決策が提供されています。それらのいくつかは、偽装された一時ファイルを使用します (例: =( … )zsh)。いくつかは使用しません (例busybox unzip -: 、ただしこれは私の環境では機能しません)。


フォーマットがzipではなく7zだった場合も、問題は同様になります。比較このスレッド:

パイプを通そうとしている7za

7zaC++ プログラム内のパイプラインで実行しようとしています。[…]

コマンドラインで実行しようとしても同じ結果になります。

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

E_NOTIMPL

Igor Pavlov (7-zip の作成者) からの答えは次のとおりです。

-si7-zip は 7z アーカイブに対して「シーク」操作を必要とします。そのため、 7z アーカイブからの抽出には使用できません。

これは2016年3月30日のものです。私のテストと変更履歴この声明は2019年でも有効であることを示しています。さらに、bsdtar私のDebianでは助けることができませんError seeking in stdin。7z形式だと思います本当にシーク可能なファイルが必要です。

関連情報