Суммируйте размеры файлов по годам и месяцам и включайте итоговые итоги при печати - PullRequest
1 голос
/ 22 марта 2019

Я следую рекурсивному решению @ zdim в этом вопросе самый быстрый способ суммировать размеры файлов по владельцам в каталоге , чтобы получить мои размеры файлов, суммированные по годам-месяцам

perl -MFile::Find -E' use POSIX;
    $dir = shift // "."; 
    find( sub { 
        return if /^\.\.?$/; 
        my ($mtime, $size) = (stat)[9,7];
        my $yearmon = strftime "%Y%m",localtime($mtime);
        $rept{$yearmon} += $size ;
    }, $dir ); 
    say ("$_ => $rept{$_} bytes") for sort keys %rept
'

Это дает такие результаты.

201701 => 7759 bytes
201702 => 530246 bytes
201703 => 3573094 bytes
201704 => 425827 bytes
201705 => 3637771 bytes
201706 => 2325391018 bytes
201707 => 127005 bytes
201708 => 2303 bytes
201709 => 231465431 bytes
201710 => 273667 bytes
201711 => 6397659 bytes
201712 => 333587 bytes
201802 => 874676 bytes
201803 => 147825681 bytes
201804 => 84971454 bytes
201805 => 3483547 bytes
201806 => 8004797 bytes
201807 => 184676 bytes
201808 => 1967947 bytes
201809 => 1592310 bytes
201810 => 24176 bytes
201811 => 883378 bytes
201812 => 6661592 bytes
201901 => 33979401 bytes

Но мне нужно включить итоги по годам после печати всех доступных месяцев в данном году, как показано ниже

201710 => 1111 bytes
201711 => 2222 bytes
201712 => 3333 bytes
2017  => 6666 bytes ( summed up )
201803 => 11111 bytes
201809 => 22222 bytes
2018  => 33333 bytes ( summed up )

Как мне это получить? Могут быть пропуски в году-месяце, и он не должен заканчиваться на 12-й месяц для каждого года.

Ответы [ 2 ]

3 голосов
/ 22 марта 2019

Два небольших изменения сделают свое дело.

perl -MFile::Find -E' use POSIX;
    $dir = shift // "."; 
    find( sub { 
        return if /^\.\.?\z/;                             # Fixed $ -> \z
        my ($mtime, $size) = (stat)[9,7];
        my $yearmon = strftime "%Y%m",localtime($mtime);
        $rept{$yearmon} += $size;
        $rept{substr($yearmon, 0, 4)} += $size;           # <---
    }, $dir ); 
    say "$_ => $rept{$_} bytes"
        for sort { "${a}99" cmp "${b}99" } keys %rept;    # <---
'
2 голосов
/ 22 марта 2019

Учитывая, что вы создали хеш %rept в первой части вашего кода, секция отображения должна выглядеть примерно так:

# Keep track of current year and current year total
my ($year, $year_total);

for (sort keys %rept) {
  # Get the year from the current record
  my $this_year = substr($_, 0, 4);
  # If the year has changed, then print a total line
  # and reset the year total.
  if (defined $year and $year ne $this_year) {
    say "$year   => $year_total bytes";
    $year_total = 0;
  }
  # Add to the year total and store the current year
  $year_total += $rept{$_};
  $year = $this_year;

  say "$_ => $rept{$_} bytes";
}

# Final year total line
say "$year   => $year_total bytes";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...