2010-07-19 68 views
0

我正在扫描一个文件系统,并希望确定磁盘上文件的分配大小。如何使用Perl确定磁盘上的实际文件大小?

使用stat()我可以得到的文件大小作为(stat(_))[7],在磁盘上所分配的块可以从(stat(_))[12]获得,而“文件系统I/O优选的嵌段大小”是(stat(_))[11]

但是,如果我只是繁殖stat列11和12,我不会看到磁盘上分配的空间(在Solaris 5.10 sparc上)。

如何以编程方式从Perl中的stat()函数调用获取磁盘上为文件分配的空间?

回答

2

(stat _)[11]暴露的值是st_blksize,这是作为documented

一个提示, “最好的” 单元大小I/O操作。该字段未针对块特殊或字符特殊文件定义。

这不一定是在其上的文件所在的特定文件系统的块大小,但同样的手册页包含一个方便的定义:

blkcnt_t st_blocks; /* Number of 512 byte blocks allocated*/ 

所以,你可以使用代码, as

#! /usr/bin/perl 

use warnings; 
use strict; 

sub usage { "Usage: $0 file ..\n" } 

die usage unless @ARGV; 

foreach my $file (@ARGV) { 
    my $dir = dirname $file; 

    my $blocks = (stat $file)[12]; 
    unless (defined $blocks) { 
    warn "$0: stat $file: $!\n"; 
    next; 
    } 

    print "$file - ", $blocks * 512, "\n"; 
} 

如果您担心文件系统的块大小不是512的倍数,d ouble检查与任何

df -g <directory>

,或者如果你有根

fstyp -v /dev/dsk/...

对于一个普通的文件,文件本身的大小,(stat _)[7],通常比总规模较小所有块被分配,因为文件系统分配整个块。

2

这是在ZFS文件系统上吗?我不确定它如何与Perl的stat函数调用进行交互,但是实际文件大小与ZFS中磁盘上报告的内容之间通常存在差异,这取决于元数据和压缩。根据perldoc -f stat中的文档,我没有看到任何足够的信息可以从Perl的stat中提取出来,以便在ZFS的独特情况下发现实际存在于磁盘上的内容。如果一切都失败了,你需要不惜一切代价知道磁盘上的实际内容,作为最后一次难以捉摸的追求,你可以简单地将其发送到du

See here.

+1

'du'是我的选择,因为它提供了OP正在查找的数据,并且很容易将其称为单个文件或整个内容目录。 – Ether 2010-07-19 14:57:03

相关问题