我正在扫描一个文件系统,并希望确定磁盘上文件的分配大小。如何使用Perl确定磁盘上的实际文件大小?
使用stat()我可以得到的文件大小作为(stat(_))[7]
,在磁盘上所分配的块可以从(stat(_))[12]
获得,而“文件系统I/O优选的嵌段大小”是(stat(_))[11]
。
但是,如果我只是繁殖stat列11和12,我不会看到磁盘上分配的空间(在Solaris 5.10 sparc上)。
如何以编程方式从Perl中的stat()函数调用获取磁盘上为文件分配的空间?
我正在扫描一个文件系统,并希望确定磁盘上文件的分配大小。如何使用Perl确定磁盘上的实际文件大小?
使用stat()我可以得到的文件大小作为(stat(_))[7]
,在磁盘上所分配的块可以从(stat(_))[12]
获得,而“文件系统I/O优选的嵌段大小”是(stat(_))[11]
。
但是,如果我只是繁殖stat列11和12,我不会看到磁盘上分配的空间(在Solaris 5.10 sparc上)。
如何以编程方式从Perl中的stat()函数调用获取磁盘上为文件分配的空间?
在(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]
,通常比总规模较小所有块被分配,因为文件系统分配整个块。
这是在ZFS文件系统上吗?我不确定它如何与Perl的stat函数调用进行交互,但是实际文件大小与ZFS中磁盘上报告的内容之间通常存在差异,这取决于元数据和压缩。根据perldoc -f stat
中的文档,我没有看到任何足够的信息可以从Perl的stat
中提取出来,以便在ZFS的独特情况下发现实际存在于磁盘上的内容。如果一切都失败了,你需要不惜一切代价知道磁盘上的实际内容,作为最后一次难以捉摸的追求,你可以简单地将其发送到du
。
'du'是我的选择,因为它提供了OP正在查找的数据,并且很容易将其称为单个文件或整个内容目录。 – Ether 2010-07-19 14:57:03