Linuxは圧縮なしでZIPサイズを決定します。

Linuxは圧縮なしでZIPサイズを決定します。

zipコマンドを使用してZIPファイルを作成したいです。 Zipファイルには、複数のサブディレクトリ、ファイルなどを含む複数のディレクトリが含まれています。

実際にディスクに圧縮する前にZIPファイルの最終サイズを計算する方法はありますか?

例:最終的なZIPファイルサイズを計算して、ZIPが特定のサイズのコンテナに入ることができるかどうかを確認します(tmpでもディスクに収まらないと、ディスクに関する情報を提供せず、圧縮が失敗するため、ディスク上で操作を実行できません) 。アーカイブサイズ)

答え1

~からzip マニュアルページ:

ストリーミング入力と出力。 zipはまた、単一のダッシュ( "-")をzipファイル名として受け入れます。この場合、zipファイルを標準出力に書き込むことで、出力を別のプログラムにパイプすることができます。

だから:

$ zip -r - foo | wc -c

fooディレクトリの圧縮サイズをバイト単位で通知します。

7zはzipファイルの標準出力に書き込めません。

別のオプションは、メモリディスクを作成して圧縮することです。

答え2

StdOutで圧縮してバイト数を計算できますが、AFAIKzipはstdoutで圧縮しません(7zZIP形式を生成できる他のユーティリティも同様です)(*)。

Linuxでは、出力ファイルが指定されていない場合、通常は.tar.gzファイルを生成し、ユーティリティをstdoutに出力します。

# compute size
outputSize=$(tar -cz the_directories | wc -c)
# create file
tar -czf some.tar.gz the_directories

いずれにせよ、2回の圧縮を実行しており、変換を行わないと出力サイズを実際に予測することはできません。

(*)おそらく終わりを見ないとZIPファイルをデコードできないからです。

答え3

する

タールCF  >(トイレ-c)  <ファイル名パラメータ>;睡眠1
ファイルに書き込むのではなく、書き込まれたバイト数を報告するコマンドにパイプをtar作成します。wc -ctar圧縮に必要なすべてのオプションが含まれています。)これはbashの「プロセス置換」機能を使用します。sleep 1これがなければ、コマンドが完了するとシェルは次のシェルプロンプトを発行し、コマンドが完了するのを待たないためにtar使用されます。wc

Bashがない場合は、名前付きパイプを使用して同じことを実行できます。

関連情報