更新:マニュアルページをよく調べたところ、unzipはまだ標準入力でアーカイブ読み取りをサポートしていないことがわかりました。ユーザーはマニュアルページを参照できますfunzip
。これは私の質問に疑問を提起するようですが、とにかくそのままにします。
私はID関数として機能するコマンドを生成するためにzipとunzipを作成しようとしています。つまり、stdinで入力を受け入れ、stdoutで同じ出力を生成することを意味します。しかし、私はそれを動作させることはできません。私は両方のマニュアルページを読みました(特にzipには詳細なマニュアルページがあります)、これがうまくいくと思います。
echo "hello" | zip | unzip -p | echo
説明する:
- echoは初期標準入力を生成する必要があります。
- マニュアルページによると、コマンドなしのzipはstdinから入力を受け取り、stdoutから出力を生成します。
- -pで解凍すると、標準出力として出力が生成されます。注:入力が標準入力から到着したことを示すために、ここに欠けているものがあると思います。私は
-
成功せずに追加しようとしました。マニュアルページではこの内容を扱っていないようです。 - echo は標準出力に表示される内容を可視化します。
注:このコマンドは単一のファイルのみを提供したいので、ディレクトリ/複数のファイルについて心配する必要はありません。
ベストアンサー1
unzip
zip
アーカイブファイルに関する情報が蓄積され、最後にコンテンツの全リストと統計が記録されるため、アーカイブは検索可能(ランダムアクセス)が可能である必要があります。したがって、パイプはzipアーカイブとして許可されません。
zip
アーカイブ内の各ファイルの長さは個別に即座に圧縮されるため、執筆時点では不明です。
tar
対照的に、書き込みと読み出しはパイプを介して行うことができます。これに対するオーバーヘッドは、(a)特定のファイルを見つけるためにファイルを順番に読み取る必要があり(メタデータがアーカイブ全体に分散しているため)、(b)アーカイブ全体を1つの単位に圧縮および圧縮解除する必要があるため、検索は可能だという点です。 1つのファイルでアーカイブ全体を解凍する必要があります。
編集:tar
注意事項の少しライダー:アーカイブが次の場合いいえその後、圧縮はtar
ディスク上のファイルデータを検索できます(各ファイルのサイズとブロックの塗りつぶし規則を知っています)。テープドライブに「ブロックスキップ」機能がある場合は、その機能を使用できます。パイプ内でスキップしたいファイルを読み取って削除する必要があります。