-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、および-sテストを最適化するために、一度だけ呼び出して、その後stat疑似ファイル名を使用します_

このread_size関数は単純な数値を返しますが、出力される文字列の 3 桁ごとにコンマが追加されるため、より大きな値でも読みやすくなります。

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 に答える