のような暗号化されたファイルがあります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
前に出力が表示されます。gpg
Extracting 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
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 の作成者) からの答えは次のとおりです。
-si
7-zip は 7z アーカイブに対して「シーク」操作を必要とします。そのため、 7z アーカイブからの抽出には使用できません。
これは2016年3月30日のものです。私のテストと変更履歴この声明は2019年でも有効であることを示しています。さらに、bsdtar
私のDebianでは助けることができませんError seeking in stdin
。7z形式だと思います本当にシーク可能なファイルが必要です。