Short:     File Finder (custom output and search)
Author:    soenke@vapor.com (Sönke Tesch)
Uploader:  soenke@vapor.com
Type:      util/dir
Replaces:  util/dir/Find.lha
Keywords:  Find Search File
Interface: CLI Shell

What`s it all about?
====================

This is probably the 10315th implementation of a File Finder. Anyway,
I spend a full 2½ hours on the first version, even got some mails and
therefore I like it best and and wrote a smarter update :)

Find will search in a directory and its subdirectories for objects
matching a given pattern. You can say where, where not and how deep
Find should search and if it should return only files or directories
or both.
The output is customizable similar to c:lists` LFORMAT option.

Find does not need any extra libraries nor does it feature a text viewer,
database or coffee-machine. Want a fancy MUI user interface with fifty-
thousand buttons? Go and look for another program, Find is CLI-only ;)


How to use
==========

  Find PATTERN/A,LOCATIONS=ROOTDIR/M,DEPTH/N/K,DIRS/S,FILES/S,HEADER=STATS/S,
       QUIET/S,PRINTSEARCHED/S,PRINTSKIPPED/S,LFORMAT=FORMAT/K

  PATTERN
    Name of the file or directory you are looking for. This string may
    also contain standard AmigaDOS wildcards like #,?,~ etc. Please see
    your AmigaDOS manual for further details.
    Find doesn`t support paths here (e.g. txt/Hello) and will return
    error code 210 (Invalid Component Name) in this case.

  LOCATIONS (former ROOTDIR)
    Find usually starts searching in the current directory and its sub-
    directories. To let you search in other places the argument ROOTDIR
    was defined in version 1. This argument has been extended and renamed
    to LOCATIONS for Find².

    You may now give any number (well, actually 255;) of directories to
    search in. These names may also contain wildcards.

    Furthermore you can exclude directories from the search by using a
    - or a * as the first character. There`s a small difference between
    the - and the *: * will exclude _any_ directory that matches the
    given name regardless where it`s located. Like PATTERN * works with
    path-less directory names only (i.e. with "blabla" but not with
    "txt/blabla").

    NOTE:
      To exclude a directory means to exclude all its subdirectories, too!
      However, you may of course include a subdirectory of an excluded
      directory.

    Take the following directory structure as an example:
    ----------------------------------------------------------------------

    1> dir all ;; current directory is Find
           txt (dir)
                test (dir)
                  test2
             Find.mod                         Find.mod_2.0
             Test.mod
           obj (dir)
             Find.obj                         Test.obj
           testdir1 (dir)
                testdir2 (dir)
                  test1
        cmc.opt                          Find
        Find.lha                         find.mtx
        find.readme                      test
        test.mtx

    1> find test?
    txt/test/test2
    testdir1/testdir2/test1

    1> find test? test#? printsearched
    Scanning testdir1
    Scanning testdir1/testdir2
    testdir1/testdir2/test1

    1> find #?st(?|%|.m[a-y]d)  ;; AmigaDOS wildcards are powerfull! :)
    txt/test
    txt/test/test2
    txt/Test.mod
    txt/testdir1/testdir2/test1
    test

    1> find test? *test#? printsearched printskipped
    Scanning txt
    Skipped txt/test
    Scanning obj
    Skipped testdir1

    1> find test? -txt/test#? printskipped
    Skipped txt/test
    testdir1/testdir2/test1

    1> find test? -test#? printskipped
    txt/test/test2
    Skipped testdir1

    1> find test? *txt/test#? printskipped
    txt/test/test2
    testdir1/testdir2/test1
    ;; didn`t work: * doesn`t support paths

    ----------------------------------------------------------------------

    + is also supported as first character. This will do the exactly
    same as if you omit it.

    NOTE:
      · If you have a name that starts with +, - or * you`ll have to
        put one of +, - or * in front of it in order to work correctly!
      · Use "-Mr Spacey:blabla" instead of -"Mr Spacey:blabla"!

  DEPTH
    Maximum level of sub-directories Find will search in. The current
    directory (or LOCATION if used) is level 0.

      find EggPaint dh0: depth 0

    will thus search only in the the root of dh0:.
    The default is unlimited.

    NOTE:
      If Find finds a matching link it will return the path and filename
      of the file the link points to, _not_ of the link! Therefore you
      may get files very deep in your directory tree although you set
      DEPTH to 1 or even 0. Not my fault, this is the behaviour of the
      NameFromLock() function in dos.library..:|

  DIRS
    Find returns only directories matching PATTERN.

  FILES
    Find returns only files matching PATTERN.

  HEADER (former STATS)
    Find will print some extra information after the search, e.g.

      1 files and 5 directories in 2 of 7 places (0 skipped)

    This obviously means Find found 1 matching file and 5 matching
    directories in 2 directories. Find searched in a total of 7
    directories and skipped 0.

  QUIET
    By default Find prints some information about where it is currently
    looking for matching objects to the Shell window. This output can be
    switched off by setting QUIET.
    QUIET doesn`t affect output of PRINTSEARCHED and PRINTSKIPPED, so
    if both of these are set, QUIET is actually useless.

    Setting QUIET may speed-up the search significantly, partly due to
    the fact that text output is relativly slow on some configurations.

  PRINTSEARCHED
    Find prints a list of the directories it searched in.

  PRINTSKIPPED
    Same as PRINTSEARCHED but will print a list of the directories it
    skipped.

  LFORMAT or FORMAT
    This is similar to the c:list argument LFORMAT. The given string is
    written to the output for every matching object. The following commands
    are supported:

      %s - inserts full path and name of the object
      %n - inserts the name of the object
      %p - inserts the _full_ path of the object. This is different to
           c:lists` %p which prints the path relative to the current
           directory.

    Example:

      Find EggPaint#? format "Found the magnificent %n in %p."

    might output

      Found the magnificent EggPaint in My First Disk:Gfx.

    NOTE:
      Find² now automatically appends a carriage return to the end of
      the string. This is different to version 1.


Stop-That-Work® Option
======================

  Pressing ctrl-c will do a full stop, ctrl-e will stop the current
  directory scan only.


Return Codes
============

  Code  Level Meaning
     0        no matching objects found
     5  warn  object(s) found - number is in local variable Result2
    10  error one or more LOCATIONs not found
    20  fail  Usually out-of-memory condition
    21    "   Arguments didn`t match
    22    "   Wildcards in PATTERN are not valid or a path was given
    23    "   Either wildcard problem or something went wrong while
              searching for matching directories
    30    "   Virus Warning


Copyright
=========

  Find, Find.readme and Find.doc:
   Copyright 1997 by Sönke Tesch
   All Rights Reserved.

  You may re-distribute the archive as long as no file is removed or
  changed.
  Find has to be distributed for FREE, any other kind of distribution
  without my written permission is not allowed. However, this is not
  the case for any AmiNet-CD. Others please feel free to ask.
  I do not give any guarantee for the quality and usefulness of Find
  nor that it works as described or fits particular needs.


Contact
=======

  Comments, suggestions, bug-reports and Hey-I-use-it!-mails are
  always welcome! Just write to <soenke@vapor.com>.


Those finer details..
=====================

  Find features a simple build-in virus self-protection.

  Find is written using Cyclone Modula-2 by Marcel Timmermans.
  The source is available on request, just ask.

  Find is still smaller than this document :)


History
=======

  06-Aug-97 2.03 ¤ bugfix in DoDir()
                 + even more optimizations
                 ¤ viruscheck wasn`t enabled (boo:)
                 a released on Aminet

  21-Jul-97 2.02 ¤ Fixed bug in output routine (didn`t clear lines)
                 + various optimizations to get size below the magic 5k
                 + returns error if PATTERN is a path
                 ¤ (hopefully) solved problem that ctrl-e didn`t work
                   from time to time
                 a released on Aminet

  10-Jul-97 2.01 + Total number of found objects returned in Result2
                 + Fixed return codes so that they better match the
                   system "standards"
                 ¤ Although documented it wouldn`t QUIET did suppress
                   output of PRINTSKIPPED and PRINTSEARCHED
                 + Non-existing LOCATIONs return error code 10

  09-Jul-97 2.00 + added * to control search
                 + FORMAT now supports %n and %p
                 + PRINTSKIPPED & PRINTSEARCHED
                 a non-public gamma release

  08-Jul-97 2.00 + search locations may be controlled by +, -

  19-May-97 1.00 a Version 1.00 on Aminet


Have fun,
  soenk.e


--
Amiga Translators Organization * Main & German Admin, Ex-Human Listserver
ato    : ato-admin-de@ato.vapor.com & ato-admin@ato.vapor.com
private: soenke@vapor.com

