ディスク領域はブロック単位で割り当てられているため、ディレクトリが消費する実際の領域をバイト単位ではなくブロック単位で報告する方が正確ですか?
1,025バイトのファイルが1,024バイトのブロックとしてスペースが割り当てられているファイルシステムに存在する場合、そのファイルは2つのブロック全体を占めます。ファイルが1,025バイトのスペースを占めると言うよりも、これはより正確に見えます。
編集:問題のファイルシステムはext4、重複排除なし、圧縮なし、fwiwです。
私の試みは次のとおりです。
def getDirUsage(filepath, block_size=1024): # block_size as reported by os.statvfs()
'''
return the number of blocks consumed by a directory
'''
total_size = int(math.ceil(os.path.getsize(filepath)/block_size)) # debatable whether this should be included in the size
allfiles = os.listdir(filepath)
for f in allfiles:
p = os.path.join(filepath,f)
if os.path.isdir(p):
total_size += getDirUsage(p,block_size)
else:
total_size += int(math.ceil(os.stat(p).st_size/block_size))
return total_size
答え1
はい、ブロックは物理ディスク使用であるため、より良いですが、別の方法でインポートする必要があります。
os.stat
フィールドを使用してくださいst_blocks * 512
。https://docs.python.org/2/library/os.html#os.stat
os.stat(path)
stat()
指定されたパスでシステムコールと同等の操作を実行します。 (この関数はシンボリックリンクに従います。シンボリックリンクの数を計算するにはを使用しますlstat()
。)一部のUnixシステム(Linuxなど)では、次の属性も使用できます。
st_blocks
- ファイルに割り当てられた512バイトブロックの数
st_blksize
- 効率的なファイルシステムI / Oのためのファイルシステムブロックサイズ
st_blksize
可変ブロックサイズまたは重複排除機能を備えた新しい高度なファイルシステムのいずれかを使用しない限り、通常サイズは倍数に増えます。ファイルシステムの実装によっては、ファイルシステムの重複排除がブロック数に反映されると予想できますが、これを念頭に置いて重複排除はソフト/ハードリンクに似ていますが、物理データに関するものです。 FSはブロックをすべてのファイルに分割できますか、それとも単一のファイルのブロックのみを報告できますか?おそらくそうではありません。
ソフト/ハードリンクも考慮する必要があります。現在ソフトリンクターゲットのサイズを追加します(lstat
このリンクを試してください)。ハードリンクを複製する簡単な方法は、ブロックサイズをハードリンク数(st_nlink
)で割ることです。その後、ドライブ全体に対して一度だけinodeを計算します。それ以外の場合は、inode番号を追跡する必要があります。
学習の練習をしていない場合... Oukiが述べたように、du
他の人がすでにこれを考慮したように使用してください。
答え2
ファイルが実際にディスク上のどのくらいのスペースを占めるかを正確に計算するのは簡単ではありません。徹底的な答えは、ファイルサイズを次のディスクブロックに丸めるよりも複雑です。
何について:
- ハードリンク?
- ファイルシステムが内部的にディスク容量を割り当てる奇妙な方法(ハーフブロック割り当て)はありますか?
- 圧縮ファイルシステム?
- 次のエキゾチックな特徴があります。「データ重複排除」?
すべてを合計すると、作業が実際にどのように機能するかについての適切な内部理解がなければ、作業はほとんど不可能です(したがって、ファイルに関する単純な統計ではありません)。
システムツール
ただし、この目的のために、または「占有ブロック」オプションを使用して設計された多くのシステムツールがあります。最も一般的に使用される2つの方法は次のとおりです。
裏
~から男性
du
(FreeBSDで詳しく説明):DESCRIPTION The du utility displays the file system block usage for each file argument and for each directory in the file hierarchy rooted in each directory argument. If no file is specified, the block usage of the hierarchy rooted in the current directory is displayed.
LS-S
男性の場合
ls
:-s, --size print the allocated size of each file, in blocks
ls
(「ブロック」は実際には実際のディスクブロックではなく古い1024バイトブロックのように見えます。)
はい:
$ dumpe2fs /dev/mapper/vg_centurion-lv_root |head -20 |grep ^Block
dumpe2fs 1.41.12 (17-May-2010)
Block count: 13107200
Block size: 4096
したがって、ルートファイルシステムには4kブロックがあります。
$ ls -l
total 88
-rw-------. 1 root root 2510 Mar 20 18:00 anaconda-ks.cfg
-rw-r--r--. 1 root root 67834 Mar 20 17:59 install.log
-rw-r--r--. 1 root root 12006 Mar 20 17:57 install.log.syslog
Duと一緒に:
$ du -h anaconda-ks.cfg
4.0K anaconda-ks.cfg
そしてls:
$ ls -ls
total 88
4 -rw-------. 1 root root 2510 Mar 20 18:00 anaconda-ks.cfg
72 -rw-r--r--. 1 root root 67834 Mar 20 17:59 install.log
12 -rw-r--r--. 1 root root 12006 Mar 20 17:57 install.log.syslog
答え3
そして、まれなファイルも忘れないでください。
$ dd if=/dev/null of=MEAN_FILE bs=1024k seek=1024k
0+0 Datensätze ein
0+0 Datensätze aus
0 Bytes (0 B) kopiert, 1,0298e-05 s, 0,0 kB/s
$ ls -lh MEAN_FILE
-rw-r--r-- 1 yeti yeti 1,0T Apr 3 09:44 MEAN_FILE
$ du MEAN_FILE
0 MEAN_FILE