主题。我试图在不使用 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;
}
希望有人能指出我做错了什么。
最佳答案
这是一个非常基本的解决方案,可以避免使用 File::Find
模块。它忽略符号链接(symbolic link)以及伪目录 .
和 ..
,它们可能是您自己的代码问题的根源。它还通过仅调用 stat
一次并随后使用伪文件名 _
来优化 -f
、-d
和 -s
测试。
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;
}
关于linux - Perl - 无需 Find 或 du 即可获取目录大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28349632/