RFIND(1) RFIND(1)
rfind - remote find
rfind [-debug] file-system search-expression
rfind is a fast, client-server adaptation of the find(1) command. It
maps the specified file-system name to a host machine, and submits the
search-expression to the rfindd(1M) daemon running on that host, for
evaluation over the specified file-system. The rfindd(1M) daemon
searches side files for the requested information, and returns it to
rfind(1) for display on stdout. These side files were previously created
by the fsdump(1M) command, and contain information about a particular
file-system
If the -debug option is specified, then rfind will display the result of
parsing the file-system and search-expression on stdout.
File-System [Toc] [Back]
The file-system to be searched may be specified in one of three forms:
canonical, alias or local path. Only one file-system may be specified.
Remaining arguments are considered to be part of the search-expression.
If the file-system argument contains a colon ':' character, then it is
considered to be in canonical form. The portion of the name before the
first ':' is taken as the network hostname, and the remaining characters
after this ':' are taken as the full pathname of the file system subtree
to searched. For example, the command:
rfind bonnie.wpd:/cypress/att/usr/src foo.c
will send a request to the rfindd(1M) daemon on the host bonnie.wpd, to
search for the file foo.c below the directory /cypress/att/usr/src
(staying within whatever file system contains this path).
If the file-system argument does not contain a ':' character, then a list
of standard locations is searched in an attempt to resolve the file-
system as an alias. Four places are searched, in order:
1) the file referenced by the RFIND_ALIASES environment variable, if any
2) the file /etc/rfind.aliases
3) the NIS (Yellow Pages) map called rfind.aliases
4) a hardwired internal list which aliases "root" and "usr" to
"localhost:/" and "localhost:/usr", respectively.
The first of these places to specify a mapping for the file-system alias
is used. See the comments in the file /etc/rfind.aliases for a
description of that file's format.
Page 1
RFIND(1) RFIND(1)
If the file-system argument is neither in canonical form nor an alias,
then it is considered to be a local path to either an EFS, XFS or NFS
directory or other file. The path need not begin with a slash. Any
referenced symbolic links are fully resolved where possible to their
final target.
The inode named by the local path is examined. If it resides on an "efs"
or "xfs" file system, then the request is sent to rfindd(1M) on the
localhost for resolution. If it resides on an "nfs" file system, then
the file /etc/mtab is examined to determine the hostname of the server to
send the request to. For example, the command:
rfind /cypress/att/usr/src foo.c
will, in the case that bonnie.wpd:/cypress is mounted to /cypress (or, if
/cypress is a symlink, to the target of that symlink), send the same
request as the previous example. If the named inode is in an automounted
(see automount(1M)) file system, then that file system will be
automounted if it wasn't already. The local mount point need not be
isomorphic with the server's pathname for this file system.
If none of these mechanisms succeeds, then rfind(1) displays a list of
all known aliases on its error output and exits with non-zero status.
Search-Expression [Toc] [Back]
rfind accepts a boolean search-expression, written in the primaries given
below, that has a syntax similar to that of the find(1) command.
In the descriptions, the argument n is used as a decimal integer where +n
means strictly greater than n, -n means strictly less than n and n means
exactly n. Valid expressions are:
-name file True if file matches as many trailing components of the
current file's pathname as are specified in the pattern
file. The wildcard characters [, !, -, ? and * may be
used to specify filename patterns. See the section File
Name Generation of sh(1) for their usage. If the first
character of file is the slash / character, then all
components of the current file's pathname must match.
-root path True if the current file is located in the file-system
hierarchy somewhere under the directory specified by
path. If path specifies a file that is not a directory,
then this primary is true for just that specified file.
-perm [-]onum True if the file permission flags exactly match the octal
number onum (see chmod(1)). If onum is prefixed by a
minus sign, only the bits that are set in onum are
compared with the file permission flags, and the
expression evaluates true if they match.
Page 2
RFIND(1) RFIND(1)
-type c True if the type of the file is c, where c is b, c, d, l,
p, f, or s for block special file, character special
file, directory, symbolic link, fifo (a.k.a named pipe),
plain file, or socket respectively.
-links n True if the file has n links.
-user uname True if the file belongs to the user uname. If uname is
numeric and does not appear as a login name in the
/etc/passwd file, it is taken as a decimal user ID.
-group gname True if the file belongs to the group gname. If gname is
numeric and does not appear in the /etc/group file, it is
taken as a decimal group ID.
-size n[c] True if the file is n blocks long (512 bytes per block).
If n is followed by a c, the size is in characters.
-inum n True if n is the inode number of the file. If -inum is
used to display a single inode (that is, if the n inode
number specified is not prefixed with a + or -), and if
the current inode has multiple links, then the pathname
of only one of the links is available for printing.
-atime n True if the file has been accessed in n days (see stat(2)
for a description of which file operations change the
access time of a file).
-mtime n True if the file has been modified in n days (see stat(2)
for a description of which file operations change the
modification time of a file).
-ctime n True if the file has been changed in n days (see stat(2)
for a description of which file operations change the
change time of a file).
-print Always true; causes the current path name to be printed.
-ls Always true; causes current pathname to be printed
together with its associated statistics. These include
(respectively) inode number, protection mode, number of
hard links, user, group, size in bytes, and modification
time. If the file is a special file the size field will
instead contain the major and minor device numbers. If
the file is a symbolic link the pathname of the linked-to
file is printed preceded by ->. The format is identical
to that of ls -lid, however the formatting is done
internally, without executing the ls program.
-printf format Always true; causes information about the current file to
be printed using the specified format. The format is a
character string that contains three kinds of objects:
Page 3
RFIND(1) RFIND(1)
1) plain characters, which are simply copied to the
output stream, 2) the C-like escape sequences \b, \f, \n,
\r, \t and \v, which are converted (see echo(1) for their
meaning), and 3) conversion specifications, each of which
results in displaying in decimal or string form the value
of a particular attribute of the current file. The
conversion specifications recognized are described below
in the section Printf Format.
-ncheck n True if n is the inode number of the current file.
Causes the inode number and full pathname for each link
to the current file to be displayed in the fixed format
"%i\t%P\n" for each link to the current file. The output
resembles that from the ncheck(1) command.
-none Always true; suppresses the default -print operator in
the case that none of the operators -ls, -print, -printf,
or -ncheck were supplied.
-newer path True if the current file has been modified more recently
than the argument path. The file specified by path must
be root based, and reference a file within the file-
system that is being searched. See stat(2) for a
description of which file operations change the
modification time of a file.
-anewer path True if current file has been accessed more recently than
the argument path. The file specified by path must be
root based, and reference a file within the file-system
that is being searched. See stat(2) for a description of
which file operations change the access time of a file.
-cnewer path True if current file has been changed more recently than
the argument path. The file specified by path must be
root based, and reference a file within the file-system
that is being searched. See stat(2) for a description of
which file operations change the change time of a file.
-depth Always true; causes descent of the directory hierarchy to
be done so that all entries in a directory are acted on
before the directory itself.
-prune Always true; has the side effect of pruning the search
tree at the current file. If the current path name is a
directory, rfind will not descend below directory.
-follow Always true; causes the underlying file of a symbolic
link to be checked rather than the symbolic link itself.
-showdots Always true; causes the conventional "." and ".." entries
of each directory to become visible. Normally these
entries are suppressed unless explicitly named by path or
Page 4
RFIND(1) RFIND(1)
inode number.
-changed True if executing the stat(2) system call from the
rfindd(1M) daemon on the full pathname of the current
file yields a result that does not have the same file
type, modification time, change time and size values as
were observed for the current file when it was last
examined by fsdump(1M). In the case that the current
file is a directory, then the logic of the -changed
operator is optimized for use by ptools(1), a software
source control tool used internally by Silicon Graphics,
and involves executing the stat(2) system call for every
directory that contains any link (hard or symbolic) of
any file contained within the current directory.
-newdiradd format
True if executing the stat(2) system call from the
rfindd(1M) daemon on the full pathname of the current
file yields a result that does not have the same file
type, modification time, change time and size values as
were observed for the current file when it was last
examined by fsdump(1M) and that it is a directory which
contains subdirectories which previously did not exist or
were of a different type. The information about these
directories is printed using the specified format.
-stcount Always true; subtree count - increments running subtree
total by a count of one. The subtree options are
described below in the section Subtree Options.
-stsize Always true; subtree size - increments running subtree
total by the number of blocks in the current file. The
subtree options are described below in the section
Subtree Options.
-sttotal threshold
True if the running subtree total exceeds the specified
decimal threshold, or if the running subtotal is non-zero
and the current path being evaluated is the final, root
path. If true, copies the running subtotal to the
aggregate subtotal, and zeros the running subtotal. The
subtree options are described below in the section
Subtree Options.
-exit status If executed during the course of evaluating the search-
expression, causes rfind(1) to exit immediately with the
specified decimal status.
( expression ) True if the parenthesized expression is true (parentheses
are special to the shell and must be escaped).
Page 5
RFIND(1) RFIND(1)
The primaries may be combined using the following operators (in order of
decreasing precedence):
1) The negation of a primary (! is the unary not operator).
2) Concatenation of primaries (the and operation is implied by the
juxtaposition of two primaries). The and operator may also be
specified as -a.
3) Alternation of primaries (-o is the or operator).
Printf Format [Toc] [Back]
This section describes the conversion specifications accepted by the
-printf format option. Each conversion specification consists of the
character % and a single following conversion character. Numeric
quantities are output in decimal, except for permissions, which are
octal.
The conversion specifications and their meanings are:
%a,%c,%m The access (atime), change (ctime) or modification (mtime) time
stamps for the current file, as seconds since the epoch.
%u,%g The numeric user (uid) or group (id) for the current file.
%p The octal permissions (mode, including type) for the current
file.
%n The number of links to the current file.
%i The inode number of the current file.
%s The size in bytes of the current file.
%e The NFS internal generation number (gen) of the current file.
%d For block and character special files, the major/minor device
(rdev) of the current file. For other file types, this is
zero.
%x For directory and regular files, the number of EFS extents.
For other file types, this is zero.
%N The actual number of links observed when fsdump(1M) traversed
the file-system. This will usually be the same value as for
%n, above, unless either a concurrent update caused
inconsistent data to be captured (rare but allowed), or
fsdump(1M) lacked permissions to scan part of the directory
structure (in which case, inode contents are still available,
but names are not). The fsdump(1M) command runs setuid root
only long enough to obtain a read only file descriptor on the
target file-system in order to read inode contents, then
Page 6
RFIND(1) RFIND(1)
restores its invoker's privileges.
%E For directories, the number of directory entries observed when
fsdump(1M) traversed the file-system.
%S The number of active inodes below this inode in the file-system
hierarchy. This value is only non-zero for directories. The
conventional "." and ".." directory entries are included in
this count.
%I The total number of active inodes in the file-system.
%M The pathname of the mount point on which the current file-
system was mounted when fsdump examined it.
%Q One of the "file environment" attributes: a quick and dirty
checksum of just the first 8 bytes of each 512 block of the
file, plus the inode number of the file.
%Y One of the "file environment" attributes: If the current file
is a symbolic link, displays the path contained in the link
file. If the file is not a symbolic link, or its contents
could not be read by fsdump(1M), then displays the empty
string.
%U Aggregate subtree total - see further the section Subtree
Options.
%R One of the "file environment" attributes: the top-of-trunk RCS
delta number. This value is maintained for files that appear
to be RCS ,v files, and is the empty string for other files.
%T One of the "file environment" attributes: the top-of-trunk RCS
date stamp. This value is maintained for files that appear to
be RCS ,v files, and is the empty string for other files.
%L One of the "file environment" attributes: the user name of the
locker of locked RCS ,v files. For any other file, this is the
empty string.
%A One of the "file environment" attributes: the user name of the
author of the RCS top-of-trunk delta. For other files, this is
the empty string.
%D The pathname of the directory containing the current file, or
dirname.
%B The basename of the current file.
%P The full pathname of the current file.
Page 7
RFIND(1) RFIND(1)
%W The canonical full pathname of the current file. If the file-
system argument to rfind passes through a symlink, then the
"%P" format will show you a pathname relative to the path
provided in the file-system argument, whereas "%W" will show
you the canonical pathname, free of symlinks.
%Z The full pathname of the new subdirectory within the current
file.
%% Same as %.
Subtree Options [Toc] [Back]
The -stcount, -stsize and -sttotal options, together with the -printf
"%U" format, provide a mechanism to group subtrees of the searched tree
by sizes or counts. The -sttotal option implies the -depth option. The
rfind command maintains two internal values, the running subtotal and the
aggregate subtotal. Both values are initialized to zero.
The running subtotal is maintained during the recursive depth first
search so that for directories it is always the total values not already
aggregated for the subtree below the directory, and for other files, it
is always the value for just that file. The aggregate subtotal is reset
to zero before evaluating the search-expression for each file.
Whenever the -stcount option is evaluated, it increments the running
subtotal by one.
Whenever the -stsize option is evaluated, it increments the running
subtotal by the size in blocks of the current file.
Whenever, for an individual file or for a subtree, the -sttotal option is
evaluated and the current running subtotal exceeds the threshold
specified on the -sttotal option, then the running subtotal is copied to
the aggregate subtotal, and the running subtotal is reset to zero. When
evaluating the search-expression for the final (top) directory of the
search (namely, the directory specified or implied by the -root option),
the -sttotal option copies any non-zero running subtotal to the aggregate
subtotal, even if it does not exceed the specified threshold, and
evaluates as true if a copy was done.
The -printf "%U" format displays the current value of the aggregate
subtotal.
These options are intended to be used together. Typically one of either
the -stcount or -stsize option is used to increment the running subtotal,
along with the -sttotal option to copy the running subtotal to the
aggregate subtotal whenever the threshold is reached, along with the
-printf "%U" format to display the aggregate subtotal.
For example, one could determine where, in a large RCS based source tree,
the recent (say, in the last day) changes to RCS/*,v files were
clustered, with the command:
Page 8
RFIND(1) RFIND(1)
rfind cypress 'RCS/*,v' -mtime -1 -stcount -o -type d -sttotal 10
-printf "%U\t%P\n"
The output from the above command might look like:
14 /cypress/att/usr/src/cmd/motif/clients/4Dwm/RCS
13 /cypress/att/usr/src/cmd/motif/sgi/book
12 /cypress/att/usr/src/cmd/X11R4/mit/fonts.pcf/bdf/75dpi/RCS
16 /cypress/att/usr/src/cmd/X11R4/mit
17 /cypress/att/usr/src/cmd/demo
14 /cypress/att/usr/src/cmd
11 /cypress/att/usr/src/man
10 /cypress/att/usr/src/gfx/lib/libgl/LIGHT/asmgfx/RCS
11 /cypress/att/usr/src/gfx/lib/libgl/LIGHT/cgfx/RCS
14 /cypress/att/usr/src/gfx
32 /cypress/att/usr/src
10 /cypress/bsd/src/etc/timed/RCS
1 /cypress
The above output shows the several subtrees containing 10 or more changed
RCS/*,v files, with the number of such files in the first column.
For another example, one could determine where disk space was being used
on the root file system with the command:
rfind root -stsize -sttotal 1000 -printf "%U\t%P\n"
This command produces output like the following:
1374 /bin/wsh
1201 /bin/news_server
4991 /bin
3551 /etc/gl
3651 /etc
2192 /stand/ide
2817 /unix
1961 /
From this output, one can see that three individual files, /bin/wsh,
/bin/news_server and /unix, exceeded the 1000 block threshold, that most
of the remaining disk space is in use by files under the directories
/bin, /etc/gl, /etc and /stand/ide, and that 1961 blocks of data resides
somewhere else on the root file system.
Defaults [Toc] [Back]
To make interactive use easier, rfind supports several default options
and primaries in the search-expression.
1) A default leading option of -root /rootpath is supplied, where
/rootpath is the mount point implied by the first argument to rfind.
Page 9
RFIND(1) RFIND(1)
2) The search-expression is parsed from left to right in two phases.
3) Unexpected arguments in the first phase that begin with the '/'
character are supplied a default -root option.
4) The -root path primaries constructed during the first phase are
automatically separated from each other by the -o operator.
5) The first phase ends at the first argument that is neither an
explicit -root nor starts with the '/' character.
6) At the end of the first phase, an automatic opening ( parenthesis is
inserted, so that the entire list of -o separated roots just built is
concatenated (implying the -a operator) with the expression resulting
from the second phase.
7) Unexpected arguments in the second phase that do not begin with the
'-' character are supplied a default -name option.
8) At the end of the second phase, sufficient closing ) parentheses are
supplied to match any unmatched opening ( parentheses.
9) Finally, if none of the operators -ls, -print, -printf, -none or
-ncheck appeared, a default -print operator is supplied.
The result of the above defaults is that the command:
rfind cypress ed.c
is automatically expanded into the equivalent command:
rfind cypress -root /cypress -a \( -name ed.c \) -print
and that the command:
rfind bugs /d1/Bugs /d1/alphabugs 1234
is automatically expanded into the command:
rfind bugs -root /d1 -a \( -root /d1/Bugs -o -root /d1/alphabugs \)
-a \( -name 1234 \) -print
Performance [Toc] [Back]
The rfindd (1M) daemon dynamically selects from several available search
strategies in order to provide optimum performance.
1) The -root path option may be used to specify a small portion of the
file-system to be searched.
2) The -name file option may take advantage of a secondary sort index by
file basename. The first wildcard character [, ? or * in the
basename of the provided name terminates the portion of the basename
Page 10
RFIND(1) RFIND(1)
which is used to restrict the search.
3) If the -inum n or -ncheck n options are used, then direct and rapid
lookup is possible.
4) If the either of the options -prune or -depth are used, then this
disables the above search strategies (2) by name and (3) by inode
number.
Small searches that are able to take advantage of one of the above search
strategies often complete in less than 1 second. Large searches that
require walking a large tree can take up to several minutes, depending
primarily on server performance.
The selection of search strategy is based on dynamically computed
weights, so two rfind(1) commands that are syntactically identical may be
accomplished by different strategies depending for example on the
relative size of the subtrees specified by -root path options and the
relative portion of the name space covered by -name file options.
The order of output is dependent on the search order. In the case that
the secondary sort index by file basename is used, the output will not
appear to have any particular order.
find(1)">Comparison to find(1) [Toc] [Back]
The rfind(1) has the following new options that are not available in the
find(1) command: -root, -ls, -printf, -none, -ncheck, -showdots,
-stcount, -stsize, -sttotal, -changed and -exit.
The following fin
: -cpio, -ok,
-exec, -local and -mount. Since the preferred way to create cpio
archives is to use the cpio(1) command itself, perhaps receiving
filenames via a pipe from the find(1) command, it did not seem worthwhile
to maintain the obsolete variant of cpio that is embedded in the find(1)
command. Since the rfind(1) uses rpc(3R) with minimal authentication,
the -ok and -exec options would have presented unacceptable security
compromises. Since the rfind(1) command only works on a single file-
system, the -local and -mount options are effectively always on.
The find(1) searches in realtime on multiple file systems, whereas
rfind(1) searches the previously created side file of a single file
system.
The find(1) command is a single process utility, whereas the rfind(1)
command is the frontend of client-server utility.
Searching a large file system is many times faster with rfind(1) than
with find(1).
The -name file option of rfind(1) supports multiple components in the
pattern file.
Page 11
RFIND(1) RFIND(1)
The command line defaults simplify the use of rfind(1).
Examples [Toc] [Back]
To find all files named 'find*' in Cypress:
rfind cypress 'find*'
To display all character special devices on the root file system except
those under any dev directory:
rfind root -type d -name dev -prune -o -type c -print
To find all symbolic links that point off the current file system (or
point nowhere):
rfind cypress -follow -type l
To display the grand total number of blocks contained in all files and
(recursively) directories within a directory subtree rooted at $P, where
$P is the canonical (symlink free) absolute (root based) path to the top
of the subtree:
rfind $P -stsize $P -sttotal 1 -printf "%U\t%P\n"
The output of the above command is similar to the output of:
du -s $P
/etc/rfind.aliases List of file-system mappings.
/etc/passwd UID information supplier
/etc/group GID information supplier
chmod(1), cpio(1), echo(1), find(1), fsdump(1M), ncheck(1), rfindd(1M),
sh(1), test(1).
stat(2), umask(2), rpc(3R), fs(4).
Do not use the -prune option with either of the -depth or -sttotal
options, because the alternative tree walk order used by these options
confuses the logic of the -prune option, causing the wrong file-system
subtree to be pruned.
PPPPaaaaggggeeee 11112222 [ Back ]
|