#!/usr/bin/perl use strict ; use warnings ; #use integer ; use CGI qw/:standard/ ; use File::Find ; no warnings 'File::Find' ; use constant NAME_WIDTH => 120 ; $| = 1 ; # Set these my $dir = '/srv/media' ; my $url_prefix = '/media' ; my $pattern = param('find') ; my @patterns = split /\s+/, $pattern ; print header(-charset=>'UTF-8'),start_html('Find...'),h1('Find media'),h2('Substring to search for:'), start_form(-method=>'GET'),textfield(-name=>'find',-override=>1),submit('submit','Find'),end_form(); print_list(@patterns) if @patterns ; print end_html ; exit ; sub print_list { my @patterns = map { quotemeta } @_ ; print hr(),h2("Searching for '@patterns'..."),"
" ;
find ({
wanted=>get_wanted(@patterns),
follow=>1,
follow_skip=>2,
# preprocess=>sub { return sort { $b cmp $a } grep { !/^\./ } @_ ; }
}, $dir) ;
print "" ;
print h2("... done.") ;
}
sub get_wanted {
my @patterns = @_ ;
my $hits = 0 ;
return sub {
return unless -f _ ;
if (/^\./) {
$File::Find::prune = 1 ;
return ;
}
(my $name = $File::Find::name) =~ s!^$dir!!o ;
if (@patterns == grep { $name =~ /$_/i } @patterns) {
$hits++ ;
(my $href = "$url_prefix$name") =~ s! !%20!g ;
my $size = -s _ ;
if ($size > 1048576) {
$size >>= 20 ;
$size .= 'M'
} elsif ($size > 1024) {
$size >>= 10 ;
$size .= 'k'
}
$name = substr($name,0,30).' ... '.substr($name,-(NAME_WIDTH-35)) if length($name) > NAME_WIDTH ;
print '' unless -r _ ;
my $bgcolor = $hits & 1 ? 'white' : '#EEEEEE' ;
$href =~ s/'/'/;
printf "%-s%s%5s",$href,substr($name,0,NAME_WIDTH),' 'x(NAME_WIDTH-length($name)),$size ;
print '' unless -r _ ;
print "\n" ;
}
} ;
}