主题。我试图在不使用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;
}
希望有人可以指出我做错了什么。
答案 0 :(得分:1)
这是一个避免File::Find
模块的非常基本的解决方案。它忽略了符号链接以及伪目录.
和..
,它们可能是您自己的代码问题的根源。它还通过调用-f
一次并使用伪文件名-d
来优化-s
,stat
和_
测试。
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;
}