Xref: feenix.metronet.com comp.unix.questions:8632
Newsgroups: comp.unix.questions
Path: feenix.metronet.com!news.ecn.bgu.edu!usenet.ins.cwru.edu!howland.reston.ans.net!noc.near.net!uunet!boulder!wraeththu.cs.colorado.edu!tchrist
From: Tom Christiansen <[email protected]>
Subject: Re: Finding files in search-paths -- how??
Message-ID: <[email protected]>
Originator: [email protected]
Sender: [email protected] (The Daily Planet)
Nntp-Posting-Host: wraeththu.cs.colorado.edu
Reply-To: [email protected] (Tom Christiansen)
Organization: University of Colorado, Boulder
References: <[email protected]>
Date: Wed, 28 Jul 1993 16:59:46 GMT
Lines: 47

From the keyboard of [email protected] (Allen Chen):
:I think this should be a simple thing to do, but no one around here seems
:to know!  So, how would I search for files in my search-path (without
:actually going into each path maunally, etc...)?  Is there a command for
:this or would I have to use find?   As far as I have been able to tell, the
:search-path only gets searched when trying to execute a file...
:Thanks in advance!

Here's the "wh" command I use:

   #!/usr/bin/perl
   foreach $file (@ARGV) {
       foreach $dir (split(/:/,$ENV{PATH})) {
           -x ($path="$dir/$file") && print "$path\n";
       }
   }

Another intersting one is pgrep, or pathgrep:

   #!/usr/bin/perl
   chop($cwd = `pwd`) unless $cwd = $ENV{PWD};
   $regexp = shift || die "usage: $0 regexp\n";
   for $dir (split(/:/,$ENV{PATH})) {
       chdir($dir =~ m#^/# ? $dir : "$cwd/$dir") || next;
       opendir(DOT, '.') || next;
       while ($_ = readdir(DOT)) {
           next unless -f;
           next unless -x _;
           next unless /$regexp/o;
           print "$dir/$_\n";
       }
   }


Here's another, much faster version of pgrep, but arguably less correct.

   #!/usr/bin/perl
   $regexp = shift || die "usage: $0 regexp\n";
   for $dir (split(/:/,$ENV{PATH})) {
       opendir(DOT, $dir) || next;
       while ($_ = readdir(DOT)) {
           next unless /$regexp/o;
           print "$dir/$_\n";
       }
   }

--tom