web-dev-qa-db-ja.com

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

_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
Marcello90

タグ付けしていません Zip ですが、ファイル名には_.Zip_が含まれているため、復号化した後は実際にはZipファイルであると思います。

この回答 を参照してください:

Zipファイル形式には、アーカイブの最後にディレクトリ(インデックス)が含まれています。このディレクトリは、アーカイブ内のどこに各ファイルが配置されているかを示しているため、アーカイブ全体を読み取ることなく、すばやくランダムにアクセスできます。

これは、パイプを介してZipアーカイブを読み取ろうとすると問題が発生するように見えます。インデックスは最後までアクセスされないため、ファイルが完全に読み取られて使用できなくなるまで、個々のメンバーを正しく抽出できません。 。そのため、アーカイブがパイプを介して提供されると、ほとんどのZipデコンプレッサが単に失敗するのは当然のことです。

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

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

私のDebian9では、bsdtar(_libarchive-tools_パッケージから)を使用したソリューションが機能します。

_gpg --decrypt file.Zip.gpg | bsdtar -xvf-
_

他の答えは他の解決策を提供します。それらのいくつかは、偽装して一時ファイルを使用します(たとえば、zshの=( … ))、いくつかは使用しません(たとえば、_busybox unzip -_ですが、これは私には機能しません)。


形式がZipではなく7zの場合、問題は同様になります。比較 このスレッド

_7za_をパイプスルーしようとしています

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

コマンドラインで実行しようとしても同じです。

_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日付けでした。私のテストと changelog は、ステートメントが2019年でもまだ有効であることを示しています。さらに、私のDebianのbsdtarは役に立たず、_Error seeking in stdin_を生成します。 7z形式本当ににはシーク可能なファイルが必要だと思います。

3