我正在扫描文件系统,并希望确定磁盘上文件的分配大小。
使用stat()我可以将文件大小设置为 ( stat(_) )[7]
,可以从( stat(_) )[12]
获取磁盘上分配的块,以及“文件系统I / O的首选块大小”是( stat(_) )[11]
。
但是,如果我只是将第11列和第12列相乘,那么我就不会得到磁盘上已分配的空间(在Solaris 5.10 sparc上)。
如何以编程方式从Perl中的stat()函数调用中获取磁盘上为文件分配的空间?
答案 0 :(得分:2)
这是在ZFS文件系统上吗?我不确定它将如何与Perl的stat函数调用交互,但是文件的实际大小与ZFS中磁盘上报告的内容之间通常存在差异,这取决于元数据和压缩。根据{{1}}中的文档,我没有看到任何方法可以从Perl的perldoc -f stat
中提取足够的信息来判断ZFS的唯一情况下磁盘上的实际内容。如果所有其他方法都失败了,你需要不惜一切代价确定磁盘上的实际内容,作为一个丑陋的最后一个追索权,你可以简单地向stat
求助。
答案 1 :(得分:2)
(stat _)[11]
中公开的值为st_blksize
,documented为
提示I / O操作的“最佳”单位大小。此字段未定义块特殊文件或字符特殊文件。
这不一定是文件所在的特定文件系统的块大小,但同一个手册页包含一个方便的定义:
blkcnt_t st_blocks; /* Number of 512 byte blocks allocated*/
因此您可以使用
等代码#! /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的倍数,请使用
进行仔细检查df -g <directory>
或者如果你有root
fstyp -v /dev/dsk/...
对于普通文件,文件本身的大小 ie ,(stat _)[7]
通常小于分配的所有块的总大小,因为文件系统分配整个块。