-2

话题。我试图在不使用 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;
}

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

4

1 回答 1

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;
}
于 2015-02-05T18:15:05.920 回答