linux - Perl - 无需 Find 或 du 即可获取目录大小

标签 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;
}

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

最佳答案

这是一个非常基本的解决方案,可以避免使用 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/

相关文章:

python - 从进程 ID 获取正在运行的 python 脚本的源文件路径

perl - 监控外部进程 : Exit when STDOUT matches pattern

Perl,取消引用引用数组

perl - 为什么我需要在使用 eval 之前本地化 $@?

macos - 在 OSX 终端中显示人类可读的文件大小

linux - 将硬编码程序输出重定向到标准输出?

mysql - Zenoss核心安装与MySQL的兼容性问题

c++ - 调用 std::thread.detach 时的意外行为

perl - 千字节到人类可读。寻找一个类轮

linux - 如何获取文件夹的大小,包括稀疏文件的表观大小? (du太慢了)