ディスク領域はブロック単位で割り当てられているため、ディレクトリが消費する実際の領域をバイト単位ではなくブロック単位で報告する方が正確ですか?
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
他の人がすでにこれを考慮したように使用してください。