#!/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" ; } } ; }