查找目录中最大的文件。 Perl

Find the biggest file in a directory. Perl

该程序列出目录中的所有文件、它们的大小、类型和所有者。如果文件是目录,则所有者是该目录中最大文件的所有者(这就是问题所在)。

use warnings;
use strict;
use diagnostics;

use feature 'say';
use File::Find;

my $dir = shift || die "Provide a directory name";
my @file;
my @owner;
my @size;
my @type;   
my $i = 0;

while( glob("$dir/*") )
{
    $file[$i] = $_;
        find(sub { $size[$i] += -s if -f }, $_);
    if( -d $file[$i] )
    {
        $type[$i] = "d";
        $owner[$i] = getpwuid((stat($_))[4]);
    }
    elsif ( -l $file[$i] )
    {
        $type[$i] = "l";  
            $owner[$i] = getpwuid((stat($_))[4]);
    }
    else 
    {
        $type[$i] = "f";
            $owner[$i] = getpwuid((stat($_))[4]);
    }
    print "$file[$i]:$owner[$i]:$type[$i]:$size[$i]\n";
    $i++;

}

此时在代码中

if( -d $file[$i] )
        {
            $type[$i] = "d";
            $owner[$i] = getpwuid((stat($_))[4]);
        }

我必须找到这个目录中最大的文件。我想,我应该使用 find 函数,但不确定该怎么做。

请调查以下代码片段是否符合您的任务。

代码对目录使用递归,核心组件是glob函数。

目录查找的结果作为散列引用返回。随心所欲地使用此参考资料。

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my $dir = shift || die "Provide directory";

my $result = dir_lookup($dir);

say Dumper($result);

exit 0;

sub dir_lookup {
    my $dir = shift;

    my($record,$max);
    my @items = glob("$dir/*");

    $max = 0;

    for my $name ( @items ) {
        my $data;
        $data->{name}  = $name;
        $data->{size}  = -s $name;
        $data->{owner} = getpwuid((stat($name))[4]);
        $data->{type}  = 'link' if -l $name;
        $data->{type}  = 'file' if -f $name;
        $data->{type}  = 'dir'  if -d $name;
        if( $data->{size} > $max and -f $name ) {
            $max = $data->{size};
            $record->{file} = $data;
        }
        if( $data->{type} eq 'dir' ) {
            my $r = dir_lookup($data->{name});
            $data->{file}  = $r->{file};
            $data->{owner} = $r->{file}{owner};
        }
        push @{$record->{items}}, $data;
    }

    return $records;
}