回答:
tl; dr:tar -cv dir | wc -c - | cut -d' ' -f 1 | awk '{print $1/1000"K"}'
du
実際にはファイル自体のサイズはカウントされません。カーネルにファイルシステムのクエリを要求するだけで、ファイルシステムはすでにファイルサイズを追跡しています。これがとても速い理由です。そのため、ファイルでdu
はなくストリームをカウントしているという事実は機能しません。私の推測では、これ1.0K
は/dev/std*
カーネルのハードコードされたサイズです。
解決策はwc -c
、カーネルを照会する代わりにバイト自体をカウントするを使用することです。
$ tar -cv dir | wc -c
次のような出力が必要な場合du -h
:
$ tar -cv dir | wc -c | awk '{print $1/1000"K"}'
awk
人間が読める結果に番号を回します。
GNU tar
を使用すると、次のことができます。
tar --totals -c . >/dev/null
...出力は次のようになります...
Total bytes written: 5990400 (5.8MiB, 5.5GiB/s)
... stderr上。同様に、任意のtar (またはストリーム)を使用dd
して、バイトカウントに関するレポートを配信できます。これはに優先する場合とそうでない場合がありますwc
が、dd
デフォルトのブロックサイズは512バイトです。これは、のブロックサイズと同じですtar
。システムのPIPE_BUFが十分に大きい場合、dd
のブロックサイズを拡張して、tar
のレコードサイズに一致させることもできます。これは20ブロック、つまり10240バイトです。このような:
tar -c . | dd bs=bx20 >/dev/null
585+0 records in
585+0 records out
5990400 bytes (6.0 MB) copied, 0.0085661 s, 699 MB/s
これは、よりも優れたソリューションを提供する場合と提供しない場合がありますwc
。
ただしdd
、tar
ユースケースとユースケースの両方で、実際にストリームを破棄する必要はありません。私はにリダイレクト/dev/null
上記の-しかし、私は簡単にいくつかのファイルにリダイレクトし、まだそれが書かれた時点で、そのサイズに関する報告書を受け取った可能性があります。
dd
(と比較wc
)。
dd
出力がコンプレッサーに渡されることを想像してみてください-たとえば、アーカイブの生のサイズと圧縮されたサイズの両方を知っていることが望ましいと思う理由が何であれ。また、レコード数に関する即時レポートを取得することも役立ちtar
ます。これは単なるアーカイブではなく、ストリーム形式です。ファイルのグループに保存して、他のファイルに保存する以外の方法で使用できます。多くの場合、変更前にストリームをブロックするのに役立ちます。それらの各レコード境界には、NULのブロック全体があります。
私はお勧めします:
tar cf - dir | wc -c
単純なc
(先頭-
は不要)を使用してtar
アーカイブを作成しf
、出力ファイルを指定して、stdoutで-
あることを示します。(なお、あなただけの大きさをしたいとの下に多くのファイルがある場合、dirはあなたかもしれないというオミットのパフォーマンス上の理由のために。)tar
v
tar
過去にsを使用してtarファイル(したがってf
と-
)を指定する必要があったことを思い出したようです。-調べたところです。なしと想定デフォルトとして。f
-
tar
/etc/mt0
/etc/mt0
「磁気テープ」という実際の意味を思い出す人はほとんどいません。;-) Solarisのtar
動作に興味があります(Solarisは、まだ古いものがあることが知られている現代のOSの1つであるためです/bin
)。
-f
旗の存在tar
ですか?
あなたの質問の文言はtar ... | wc -c
上記の答えに役立ちます。私はもともと、tarファイルの作成中にサイズを報告する必要があるという暗黙の前提で質問を読みました(おそらく、tarの出力がネットワークリンクを介してパイプ処理されていたのでしょうか?)。
その場合は、pv
パイプビューアをお勧めします。私はそれへの言及を見ましたが、まだそれを試す機会がありませんでした。
参考文献
wc
の余分な部分を省略した場合-
、後続のcut
コマンドも不要になることに注意してください。