Подсчитать количество файлов в папке по дате - PullRequest
0 голосов
/ 10 мая 2019

Мне нужно посчитать количество файлов в папке по дате, используя Perl. Вот мой код:

my $datestring = localtime(time); 
print "$datestring\n"; 
sub demFile { 
    $dir = "/root/perl/*"; 
    my @file = glob($dir); 
    foreach(@file) { 
        $a = scalar(grep $_, @file) . "\n"; 
        return $a; 
    } 
}

$b = demFile(); 
print $b;

Ответы [ 2 ]

3 голосов
/ 10 мая 2019

Как и в случае решения Kjetil S., оно принимает имена файлов, а не имена каталогов, чтобы обеспечить гораздо более гибкое решение, чем запрошенное вами.

Эта версия решает ряд проблем с Kjetil S.'s.

  • Обеспечивает минималистический результат, соответствующий философии использования цепочек инструментов.
  • Он не выполняет две статистики на файл.
  • Он не пропускает не каталоги, не простые файлы.
  • Обрабатывает ошибки.
  • Это легче читать.

Пример использования:

\ls                    | num_files_by_date
\ls /some/dir          | num_files_by_date
\ls -d /some/dir/*.txt | num_files_by_date
find dir1 dir2         | num_files_by_date

Код:

#!/usr/bin/perl
use strict;
use warnings;

use File::stat qw( stat );
use POSIX qw( strftime );

my %counts_by_date;
while (<>) {
    chomp;
    my $stat = stat($_)
       or do {
          warn("Can't stat \"$_\": $!\n");
          next;
       };

    ++$counts_by_date{ strftime("%F", localtime($stat->mtime)) }
       if !-d $stat;  # Don't count dirs.
}

printf("%s %s\n", $_, $counts_by_date{$_})
   for sort keys %counts_by_date;
2 голосов
/ 10 мая 2019
#!/usr/bin/perl
use warnings; use strict;
my($n,%n)=(0);
while(<>){
    chomp;
    next if !-f$_; #just count files, ignore dirs, symlinks etc
    my $mtime=(stat($_))[9];
    my @lt=localtime($mtime); $lt[5]+=1900; $lt[4]+=1;
    my $date=sprintf"%04d-%02d-%02d", @lt[5,4,3];
    $n{$date}++;
    $n++;
}
my @d=sort keys %n;
printf "Date $_ has %3d files\n",$n{$_} for @d;
print "A total of $n files between $d[0] and $d[-1]\n";

Сохранить как num_files_by_date.pl и chmod +x num_files_by_date.pl. Программа берет список файлов на STDIN и подсчитывает количество на каждую дату. Запустите пример так:

\ls -1 | ./num_files_by_date.pl
\ls -d1 /root/perl/* | perl num_files_by_date.pl
find dir1/ dir2/ | ./num_files_by_date.pl

Вывод может быть:

Date 2019-04-28 has   2 files
Date 2019-04-30 has   3 files
Date 2019-05-03 has   1 files
Date 2019-05-06 has   4 files
A total of 10 files between 2019-04-28 and 2019-05-06
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...