代码之家  ›  专栏  ›  技术社区  ›  PP.

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

  •  0
  • PP.  · 技术社区  · 14 年前

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

    stat() 我可以得到文件大小为 ( stat(_) )[7] ,磁盘上分配的块可以从 ( stat(_) )[12] ,并且“文件系统I/O的首选块大小”为 ( stat(_) )[11] .

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   Greg Bacon    14 年前

    公开的价值 (stat _)[11] st_blksize ,即 documented 作为

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

     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>

    或者如果你有根

    fstyp -v /dev/dsk/...

    (stat _)[7] ,通常小于分配的所有块的总大小,因为文件系统分配整个块。

        2
  •  2
  •   cikkle    14 年前

    这是在ZFS文件系统上吗?我不确定它将如何与Perl的stat函数调用交互,但文件的实际大小与ZFS中磁盘上报告的大小之间通常存在差异,这取决于元数据和压缩。根据中的文档 perldoc -f stat stat du

    See here.