查找目录中最大的文件。 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;
}
该程序列出目录中的所有文件、它们的大小、类型和所有者。如果文件是目录,则所有者是该目录中最大文件的所有者(这就是问题所在)。
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;
}