如何使用Perl确定磁盘上的实际文件大小?

时间:2010-07-19 12:11:51

标签: perl solaris

我正在扫描文件系统,并希望确定磁盘上文件的分配大小。

使用stat()我可以将文件大小设置为 ( stat(_) )[7] ,可以从( stat(_) )[12]获取磁盘上分配的块,以及“文件系统I / O的首选块大小”是( stat(_) )[11]

但是,如果我只是将第11列和第12列相乘,那么我就不会得到磁盘上已分配的空间(在Solaris 5.10 sparc上)。

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

2 个答案:

答案 0 :(得分:2)

这是在ZFS文件系统上吗?我不确定它将如何与Perl的stat函数调用交互,但是文件的实际大小与ZFS中磁盘上报告的内容之间通常存在差异,这取决于元数据和压缩。根据{{​​1}}中的文档,我没有看到任何方法可以从Perl的perldoc -f stat中提取足够的信息来判断ZFS的唯一情况下磁盘上的实际内容。如果所有其他方法都失败了,你需要不惜一切代价确定磁盘上的实际内容,作为一个丑陋的最后一个追索权,你可以简单地向stat求助。

See here.

答案 1 :(得分:2)

(stat _)[11]中公开的值为st_blksizedocumented

  

提示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]通常小于分配的所有块的总大小,因为文件系统分配整个块。