Perl - 获取没有Find或du的目录大小

时间:2015-02-05 16:53:36

标签: linux perl du

主题。我试图在不使用Find模块和不使用du命令的情况下获取目录的大小。这是我目前正在接近它的方式,但它似乎并没有恢复正确的尺寸。它返回418836个字节但是当我运行du -s时,目录大小为141508.

my $size = dir_size('wp-content');

sub dir_size {  
  my $dir  = shift;
  my $size = 0;

  opendir(DIR,"$dir");

  foreach my $node (grep(!/^\.\.?/,readdir())) {
     stat($node);
     if(-f $node) {
       $size += -s $node;
     } elsif(-d $node) {
       $size += dir_size("$dir/$node");
     } 
  }
  closedir(DIR);

  return $size;
}

希望有人可以指出我做错了什么。

1 个答案:

答案 0 :(得分:1)

这是一个避免File::Find模块的非常基本的解决方案。它忽略了符号链接以及伪目录...,它们可能是您自己的代码问题的根源。它还通过调用-f一次并使用伪文件名-d来优化-sstat_测试。

read_size函数返回一个简单的数字,但是在打印字符串的每三个数字之前添加逗号,以便对更大的值更具可读性。

use strict;
use warnings;
use 5.010;    # For `say` and regex `\K` construct

my $s = dir_size('wp-content');
1 while $s =~ s/ \d+ \K (\d{3}) /,$1/x;
say $s;

sub dir_size {  

    my ($dir) = @_;

    my $size = 0;

    opendir my ($dh), $dir or die $!;

    while (my $node = readdir $dh) {
        next if $node =~ /\A\.\.?\z/;

        my $fullname = "$dir/$node";
        stat $fullname;

        if ( -f _ ) {
            $size += -s _;
        }
        elsif ( -d _ ) {
            $size += dir_size($fullname);
        }
    }

    $size;
}