コンテンツへスキップ

指定したディレクトリを再帰的にlsし、
ファイルをファイルサイズの降順に表示する。

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

my @array = ();
my $tmp;
my $rankedFile;

my $dir = shift @ARGV;
my $length = shift @ARGV;
if (!(defined($dir))) {
    print("Please specify the dir.\n");
    exit;
}
if (!(defined($length))) {
    print("Please specify the ranking.\n");
    exit;
}

# Ranking初期化
my $i = 0;
while($length > $i){
    push(@array, '0,-');
    $i++;
}

sub reflexiveFile{
    my $dir = shift;
    my @list = ();

    opendir(DIR, $dir) or die("Can not open directory:$dir ($!)");
    @list = readdir(DIR);
    closedir(DIR);

    foreach my $file ( sort @list){
        next if ($file =~ /^\.{1,2}$/ );
        next if ( -l "$dir/$file");
        if( -d "$dir/$file" ){
            reflexiveFile("$dir/$file");
        } else {
            my $fs = -s "$dir/$file";
            my $f = "$fs,$dir/$file";
            next if(getFileSize($array[0]) >= $fs);
            ranking($f);
        }
    }
}

sub ranking{
    $array[0] = shift;

    for ( my $i = 1; $i < $length;$i++){
        $tmp = $i;
        $rankedFile = $array[$i]; # Ranking[$i]のファイル
        while( ($tmp > 0 ) and ( getFileSize($array[$tmp - 1]) > getFileSize($array[$i]) ) ){
            $array[$tmp] = $array[$tmp - 1];
            $tmp = $tmp - 1;
        }
        $array[$tmp] = $rankedFile;
    }
}

sub getFileSize{
    my @sn = split(/,/,shift);
    return $sn[0];
}

sub getFileName{
    my @sn = split(/,/,shift);
    return $sn[1];
}

sub print_array{
    @array = @_;
    @array = sort {$b<=>$a} @array;
    for (my $j=0; $j < $length; $j++){
            my $size = getFileSize($array[$j]);
            my $name = getFileName($array[$j]);
            print "$size,$name\n";
    }
}

reflexiveFile($dir);
print_array(@array);

#!/usr/bin/perl
@A = ( 1000, 10000, 1001, 1002, 1003, 10030 ,10011,);
foreach $val (@A) {
        print "asigned number = [". $val . "]\n";
}

for ( my $i = 1000; $i < 99999; $i++ ) {
        print "i = [" . $i . "]\n";
        if ( ! grep($_ eq $i, @A ) ) {
                $unsignedNumber = $i;
                last;
        }
}

print "unasigned number = [" . $unsignedNumber . "]\n";