ppt
view release on metacpan or search on metacpan
src/ls/ls.mjd view on Meta::CPAN
my @files = @ARGV ? @ARGV : qw(.);
my @lines;
for (grep {-l || ! -d} @files) {
my ($blocks, $line) = do_file($_);
push @lines, $line;
}
print map {$_->[1]} sort {$a->[0] cmp $b->[0]} @lines;
foreach $f (grep {-d && ! -l} @files) {
if (opendir DIR, $f) {
print "\n", $f, ":\n" unless @files == 1;
($blocks, @lines) = do_files($f, readdir DIR);
closedir DIR;
} else {
warn "ls: $f: $!\n";
}
print "total $blocks\n";
print map {$_->[1]} sort {$a->[0] cmp $b->[0]} @lines;
}
sub do_file {
my $file = shift;
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = lstat $file;
unless (defined $dev) {
warn "ls: $_: $!\n";
next;
}
my $perms = format_mode($mode);
my $name = $_;
if ($perms =~ /^l/) {
my $link = readlink "$dir/$_";
$name = "$name -> $link";
}
my $date = format_time($mtime);
my ($u, $g) = ui($uid, $gid);
( $blocks,
[$name,
sprintf("%s %3d %-8s %-8s %8d %s %s\n",
$perms, $nlink, $u, $g, $size, $date, $name,
)
]
);
}
sub do_files {
my $dir = shift;
my $tot_blocks = 0;
for (@_) {
next if /^\./;
my ($blocks, $line) = do_file("$dir/$_");
$tot_blocks += $blocks;
push @lines, $line;
}
($tot_blocks/2, @lines);
}
sub ui {
my ($u, $g) = @_;
$u = ($u{$u} ||= getpwuid($u));
$g = ($g{$g} ||= getgrgid($g));
($u, $g);
}
# Date formats:
# Recent: Mmm dd hh:mm (day space-filled; hour zero-filled T24)
$daterecent = '%b %d %H:%M';
# Older: Mmm dd yyyy
$dateolder = '%b %d %Y';
sub format_time {
my $time = shift;
return $time{$time} if exists $time{$time};
my $timestr;
my @time = localtime($time);
my ($sec, $min, $hour, $day, $mon, $year) = localtime($time);
if ($time < $^T - 180*24*3600 || $time > $^T + 3600) {
$timestr = sprintf "$mon[$mon] %2d %4d", $day, $year+1900;
} else {
$timestr = sprintf "$mon[$mon] %2d %02d:%02d", $day, $hour, $min;
}
$time{$time} = $timestr;
}
( run in 0.762 second using v1.01-cache-2.11-cpan-fe3c2283af0 )