FastFindFile is a small set of tools I created to help manage LARGE sets of
files which may be spread over multiple directory trees and even over multipls
drives!

To do this efficently, FFF a database listing all the files you are dealing
with. This database is in TEXT format, which mean you can edit it with a
standard text editor. You can also concatinate several FFF databases into one.

The FFF commands are:

  FFBD output-database-file source-locations-and-matches ...
    - Builds the database from one or more Directories
  FFB7Z output-database-file source-locations-and-matches ... 
    - Like FFD but uses 7ZIP listing files to build the database for
      files stored in popular archive formats. eg: 7z l *.ZIP >source-file
  FFF source-locations-and-matches ... [options]
    - Find files in the database fast!      options:
  FFCMP database-file database-file [options]
    - Compare the files on two databases
      Helpful to see what has changed from one database to the next.
  FFSAME database-file
    - Tests file in database to identify any which are the SAME (identical)

output-database-file is the database file written by FFBD and FFB7Z.
It is a text file so you can easily join them together with simple text file
concatination.

Most other arguments are a combination of source-locations and pattern[s] to
match.  Use  command  with no arguments to see details of command syntax.

source-location is:
    FFBD    - A directory [sub]tree
    FFB7Z   - output of a 7ZIP 'l' command: 7z l *.zip >source
    FFF     - database-file created by FFBD or FFB7Z

Renaining arguments are \pattern matches. A \name is determined to be the
first pattern-match by the presence of wildcard charaters ('*' and/or '?'
in it). This and remaining \names are patterns to match. This makes a simple
FFF command relatively intuitive:   FFF C:\FFF\myfiles\*.C
will list all the .C files occuring in the database: C:\FFF\myfiles

You can have multiple patterms: FFF C:\FFF\myfiles\*.COM\*.EXE
will show all .COM and .EXE files. Note that patterns are like in unix,
they do not treat '.' as special. To show ALL files, use '\*' because '\*.*'
would require the file to have at least one '.' somewhere within it's name.

If you do not specify ANY patterns, '*' is assumed, matching ALL files.

There are a couple of special leading characters on pattern:
  ':' indicates that the pattern is of files to NOT use:
        FFF C:\FFF\myfiles\:*.C
    Note that if all the patterns are ':' indicating files NOT to show,
    a '*' pattern will be added at the end, so the above is the same as
        FFF C:\FFF\myfiles\:*.C\*
    and will show all files EXCEPT ones ending in .C
    Order IS important because the tools stop looking at patterns when a match
    is found:
        FFF C:\FFF\myfiles\:A*.C\*.C
    would as you might expect, show all .C files except for ones beginning
    with 'A' because it would match the ':A*.C' first. However:
        FFF C:\FFF\myfiles\*.C\:A*.C
    WOULD show 'A*.C' files because the '*.C' patten would be matched first
    amd it would never get to the ':A*.C''.  It can be a little tricky but
    this method allows some very concise file displays.
  '\' means this is a pattern even though it does not have wildcards. If for
    example you were looking for occurances of 'MY.FIL', you could NOT use:
        FFF C:\FFF\myfiles\MY.FIL
    because FFF would look for a database by that name. Instead you use:
        FFF C:\FFF\myfiles\\MY.FIL


Notes on Database Format:

    :path for files till next ':' line
    ;;;;;;;;;;;Filename

';;;;;;;;;;;' indicates an 11 character field which contains the timestamp of
the file as well as it's size.  This is a 64 bit value expressed in a number
set which has 64 digit ranging from the ASCII characters ';' to 'z'. In other
words, the HEX value: 0x0000000000000000 is represented as ';;;;;;;;;;;', and
the HEX value: 0xFFFFFFFFFFFFFFFF is 'Jzzzzzzzzzz'.  This makes these values
hard for a human to understand, but makes the database file quite small while
remaining simple TEXT.

An additional thing I did to save space in the database files is each file
entry contains only the name of that file.  Directory paths are stored on
seperate lines which begin with ':' and appear only once, indicating the
path for all following files up until another ':' line.

These factors save quite a bit of space which makes the file smaller and faster
to read/search.  Example: A fairly large directory on my system which holds
several projects has the following statistics reported by DIR/S:
    2688 Directores, 15897 files containing 1,979,202,489 bytes.
    When I "DIR/S C:\directory >R:\file", the TEXT R:\file created is 990,813
    bytes in size. In contrast, when I do "FFD R:\file C:\directory" the TEXT
    R:\file created is 366,482 bytes in size.
With FFF I have several large directory trees like this combined into a single
database and can easily find any file(s) located anywhere in them very quickly.

Dave Dunfield   -   https://dunfield.themindfactory.com
 another way to find me: search "Dave's Old Computers" and see my
 "personal" link at bottom.   Download and see my product CATALOG!
