#!/usr/bin/perl -w
######################################################################
# (c) Michael Schilli 1999
######################################################################

use File::Find;
use strict;

my ($startdir, $pattern) = @ARGV;      # Kommandozeilen-
                                       # parameter holen
# Kommandozeilenparameter prüfen
(defined $startdir && defined $pattern) || usage();
(-d $startdir) || die "Cannot open directory $startdir";

# Traverse-Algorithmus anstoßen
File::Find::find(\&fc, $startdir);

###########################################################
sub fc {                              # Callback-Funktion
    my $file = $_;                    # Dateiname sichern

    return unless -f $file;           # Keine Directories
    return unless -T _;               # Nur Textdateien

                                      # Textsuche in der 
                                      # Datei
    open(FILE, "<$file") || warn "Cannot open $file";
    while(<FILE>) {
        if(/$pattern/o) {             # Paßt? Datei und 
                                      # Zeile ausgeben!
            print "$File::Find::dir/$file: $_";
        }
    }
    close(FILE); 
  
    $_ = $file;                       # $_ zurücksetzen
}

###########################################################
sub usage {                     # Meldung bei falschen
                                # Kommandozeilenparametern
    $0 =~ s#.*/##g;             # basename() für Skriptpfad
                                # Win32: s#.*\\##g
    print "usage: $0 startdir pattern\n";
    exit 0;                     # Programmabbruch
}
