コマンドラインから.tar.gzファイルの非圧縮ファイルデータの合計サイズを抽出するにはどうすればよいですか?
これにより、抽出されたファイルの合計コンテンツサイズが合計されます。
$ tar tzvf archive.tar.gz | sed 's/ \+/ /g' | cut -f3 -d' ' | sed '2,$s/^/+ /' | paste -sd' ' | bc
出力はバイト単位で与えられます。
説明:tar tzvf
は、ls -l
のような詳細形式でアーカイブ内のファイルをリストします。 sed
およびcut
は、ファイルサイズフィールドを分離します。 2番目のsed
は、最初のサイズを除くすべてのサイズの前に+を付け、paste
はそれらを連結し、bc
によって評価される合計式を与えます。
これにはメタデータが含まれていないことに注意してください。そのため、ファイルを抽出するときにファイルが占めるディスク容量は大きくなります。非常に小さなファイルが多数ある場合は、潜在的に何倍も大きくなります。
コマンドラインからこれを行いたい場合は、-lオプションをgzipに試してください:
$ gzip -l compressed.tar.gz
compressed uncompressed ratio uncompressed_name
132 10240 99.1% compressed.tar
コマンド gzip -l archive.tar.gz
は、2Gbを超えるファイルサイズでは正しく機能しません。私がお勧めします zcat archive.tar.gz | wc --bytes
代わりに、本当に大きなファイルの場合。
次のコマンドを使用します。
tar -xzf archive.tar.gz --to-stdout|wc -c
これは古い答えです。しかし、私はちょうど2年前にこのためのツールを書きました。 gzsize
と呼ばれ、ディスク上のファイル全体を実際に解凍することなく、gzipされたファイルの非圧縮サイズを提供します。
$ gzsize <your file>
私はすべてのサイトをウェブで見つけていますが、ファイルサイズが4GBより大きい場合にサイズを取得するというこの問題を解決しません。
最初に、どれが最も速いですか?
[Oracle @ base tmp] $ time zcat Oracle.20180303.030001.dmp.tar.gz | wc -c 6667028480 実0m45.761s ユーザー0m43.203s sys 0m5.185s
[Oracle @ base tmp] $ time gzip -dc Oracle.20180303.030001.dmp.tar.gz | wc -c 6667028480 実0m45.335s ユーザー0m42.781s sys 0m5.153s
[Oracle @ base tmp] $ time tar -tvf Oracle.20180303.030001.dmp.tar.gz -rw-r--r-- Oracle/oinstall 111828 2018-03-03 03: 05 Oracle.20180303.030001.log -rw-r ----- Oracle/oinstall 6666911744 2018-03-03 03:05 Oracle.20180303.030001.dmp real 0m46。 669s ユーザー0m44.347s sys 0m4.981s
間違いなく、tar -xvfが最も高速ですが、¿ヘッダーを取得した後に実行をキャンセルする方法は?
私の解決策はこれです:
[Oracle @ base tmp] $ time echo $(timeout --signal = SIGINT 1s tar -tvf Oracle.20180303.030001.dmp.tar.gz | awk '{print $ 3}')| grep -o '[[:digit:]] *' | awk '{sum + = $ 1} END {print sum}' 6667023572 real 0m1.005s user 0m0.013s sys 0m0 .066s