Jerry writes:

> Find out all plain text files whose file names contain "out" and whose
> contents containing "zip" (in the form of whole word),  and then output
> these files names to a file called zip.txt. (These plain text files are
> located in the sub-directories at different levels)

Here is how I would do this:

find your-dirname1 your-dirname2 -name \*out\* \
   -exec perl -e 'undef $/; 
                  $filename=$ARGV[0];
                  $_=<>; 
                  exit(!(-T $filename && /\bzip\b/))' \{\} \; -print \
     >zip.txt


Notes:

1:  I assume you were serious about the "plain text files" part.  This
    is what the "-T" bit in the Perl program looks for.  No binary
    files, right?

2:  I assume you were serious about the "zip" part, so a word like
    "unzip" would not qualify.

3:  The Perl code has some warts, but I was trying for clarity here.

4:  The "find" program is very powerful and you can never go wrong
    learning about its features.

Regards,

--kevin


PS  I thought you might like some of my favorite aliases:

# Author: kevin d. clark

# Finds text files in the specified directories.  These use Perl's -T
# and -B tests.  Here's some relevant documentation from the perlfunc 
# page:
#
#    The "-T" and "-B" switches work as follows.  The first block or
#    so of the file is examined for odd characters such as strange
#    control codes or characters with the high bit set.  If too many
#    strange characters (>30%) are found, it's a "-B" file, other-
#    wise it's a "-T" file.  Also, any file containing null in the
#    first block is considered a binary file. [....]  Both "-T" and
#    "-B" return true on a null file...
#
# Caveat programmer.
# 

# Find text files
txtfind () {
  if [ $# -eq 0 ] ; then
    txtfind .
  else
    perl -MFile::Find -e 'find(sub{print "$File::Find::name\n" if (-f
&& -T);},  <at> ARGV);' "${ <at> }"
  fi
}

# Find DOS-formatted text files
dostxtfind () {
  if [ $# -eq 0 ] ; then
    dostxtfind .
  else
    perl -MFile::Find -e 'find(sub{ 
                                     $crlf = 0;
                                     if (($f = -f) && ($T = -T)) {
                                        <at> ARGV=($_);
                                       binmode(ARGV);
                                       (/\r\n/ && $crlf++) while(<>);
                                     }
                                     print "$File::Find::name\n" 
                                       if ($f && $T && $crlf);
                                   },  <at> ARGV)' "${ <at> }"
  fi
}

# Find binary files
binfind () {
  if [ $# -eq 0 ] ; then
    binfind .
  else
    perl -MFile::Find -e 'find(sub{print "$File::Find::name\n" if (-f
&& -B);},  <at> ARGV);' "${ <at> }"
  fi
}




--
GnuPG ID: B280F24E              Never could stand that dog.
alumni.unh.edu!kdc                   -- Tom Waits
_______________________________________________
gnhlug-discuss mailing list
gnhlug-discuss@mail.gnhlug.org
http://mail.gnhlug.org/mailman/listinfo/gnhlug-discuss/

Reply via email to