du
ファイルで使用されているブロック数を計算する方法を知りたいです。
想像する
dd bs=1 seek=2GiB if=/dev/null of=big
0+0 records in
0+0 records out
0 bytes (0 B) copied, 2.3324e-05 s, 0.0 kB/s
ls -lh big
-rw-r--r-- 1 roaima roaima 2.0G May 19 15:55 big
du -h big
0 big
私はいつもそれが私に別の答えを与えると思いましたls
。違うものを測るから大丈夫です。
クラウドベースのファイルシステムがあり、ストレージのコストだけでなくデータをダウンロードするたびに支払われているため、「このツリーがディスク容量をどのくらい使用しているか」などの一般的な管理活動にアクセスするデータ量を最小限に抑える必要があります。 ?
使用されているブロックの数を知らせるライブラリ/システムコールはありませんが、おそらく1つはあります。私はdu
それがゼロでいっぱいのファイルと本当にまれなファイルを区別することができないので、それが考慮されているすべてのファイルを読むと信じていません。
では、du
使用されるブロック数はどのように計算されますか?
答え1
du
使用stat(2)
ファイルが使用するブロック数を探します。実行すると、stat big
ブロック数が与えられた数と一致することがわかりますdu
。
du
このオプションを使用してバイト数を強制的に計算する-b
と、出力はls
と一致します。
どちらの場合も、以下を使用しますstat(2)
(または少なくともfstatat(2)
私が持っているバージョンでは):
$ strace du big|&grep big
execve("/usr/bin/du", ["du", "big"], [/* 57 vars */]) = 0
newfstatat(AT_FDCWD, "big", {st_mode=S_IFREG|0644, st_size=2147483648, ...}, AT_SYMLINK_NOFOLLOW) = 0
write(1, "0\tbig\n", 60 big
加工の違いはで見ることができるdu.c
。