Here's a perl script that you can use.
Just call mfind at any directory level with a string you want to search
for.  It will recurse through every directory and scan the files.  I use it
many times every day.

regs,
-jrp



Gordon E Heiitzman wrote:

> >I have to search all the files in a directory and its subdirectories
> >and their subdirectories for a string.
> >
> >I can search a directory at a time with fgrep 'string' *.*, but this
> >is >taking ages to do for every dirictory.
> >>Is their a way to grep recursively through the directories?  I could
> >not find anything like that in the manual.
> >
> >Thanks    >Nico
> >-
>
> A friend of mine has a utility called  "tgrep"  which does exactly
> what you describe.  Has anyone else heard of this?  If it's not
> available out there I could see about getting it to you.
>            Gordy             [EMAIL PROTECTED]
>
> ___________________________________________________________________
> You don't need to buy Internet access to use free Internet e-mail.
> Get completely free e-mail from Juno at http://www.juno.com/getjuno.html
> or call Juno at (800) 654-JUNO [654-5866]
> -
> To get out of this list, please send email to [EMAIL PROTECTED] with
> this text in its body: unsubscribe suse-linux-e
> Check out the SuSE-FAQ at http://www.suse.com/Support/Doku/FAQ/ and the
> archiv at http://www.suse.com/Mailinglists/suse-linux-e/index.html
#!/usr/bin/perl
#
#       This script looks for a string in every text file it
#       can find
#
#   John Perser  (1-12-97) rev1
#   Brenden Tennant (7-15-97) added linenumber printouts
#                  added -v flag to print out every occurance in each file
#                  added -a flag to print out only the lines that contain all words in 
list
#                  added -h flag to print out a help summary
#                  added -q flag for quiet listing of filenames only
#  

#
# printhelp prints a help screen to stdout.
#
sub printhelp {
    print "\n";
    print "   Usage for mfind:\n\n";
    print "   mfind [-hva] search_word [search_word] [search_word] [...]\n";
    print "     -h prints out this help text\n";
    print "     -v displays every line with a match in each file (not just the 
first)\n";
    print "     -a displays only the lines that contain all words to search on\n";
    print "     -w strips whitespace from the begining of matched lines\n";
    print "     -q prints a quiet listing with only filenames\n";
    die "\n";
}

# check command line parms for switches
if (index($ARGV[0], "-") == 0) { $flags = shift; } else { $flags = ""; }
# make sure there is something to search for
if ($ARGV[0] eq "") { &printhelp; }

# handle switches
if (index($flags, "h") >= 0) { &printhelp; }
if (index($flags, "v") >= 0) { $verbose = 1; print "Verbose listing ON.\n"; } else { 
$verbose = 0; }
if (index($flags, "a") >= 0) { $andwords = 1; print "And word list ON.\n"; } else { 
$andwords = 0; }
if (index($flags, "w") >= 0) { $stripwhitespace = 1; print "Whitespace striping 
ON.\n"; } else { $stripwhitespace = 0; }
if (index($flags, "q") >= 0) { $nameonly = 1 } else { $nameonly = 0; }


open ( FIND, "find . -print |") || die "Couldn't run find: $!\n";

FILE:

    while ($filename = <FIND>) {
        chop $filename;
        next FILE unless -T $filename;
        if ( !open (TEXTFILE, $filename )) {
            print STDERR "Can't open $filename -- continuing...\n";
            next FILE;
        }
        $linenumber = 0;
        while ( <TEXTFILE> ) {
            $linenumber ++;
            if ($andwords == 0) {
                foreach $word (@ARGV) {
                    if (index($_, $word) >= 0) {
                        if ($nameonly == 1) { print "$filename\n"; next FILE; }  
                        if ($stripwhitespace == 1) {  s/^\s*//; }
                        print "$filename ($linenumber)-> $_";
                        if ($verbose == 0) { next FILE; }
                    }
                }
            }
            else {
                $valid = 1;
                foreach $word (@ARGV) {
                    if ((index($_, $word) >= 0) && ($valid == 1)) { 
                        $valid = 1; 
                    } else { $valid = 0; }                    
                }
                if ($valid == 1) {
                    if ($stripwhitespace == 1) { s/^\s*//; }
                    print "$filename ($linenumber)-> $_";
                    if ($verbose == 0) { next FILE; }
                }
            }
        }
    }




















Reply via email to