| FIND(1) | General Commands Manual | FIND(1) |
find — walk a file
hierarchy
find |
[-H | -L |
-P] [-EXdsx]
[-f path]
path ... [expression] |
find |
[-H | -L |
-P] [-EXdsx]
-f path
[path ...] [expression] |
The find utility recursively descends the
directory tree for each path listed, evaluating an
expression (composed of the “primaries”
and “operands” listed below) in terms of each file in the
tree.
The options are as follows:
-E-regex
and -iregex primaries as extended (modern) regular
expressions rather than basic regular expressions (BRE's). The
re_format(7) manual page fully
describes both formats.-H-LThis option is equivalent to the deprecated
-follow primary.
-P-Xfind to be safely used in conjunction with
xargs(1). If a file name contains any
of the delimiting characters used by
xargs(1), a diagnostic message is
displayed on standard error, and the file is skipped. The delimiting
characters include single (“ ' ”)
and double (“ " ”) quotes,
backslash (“\”), space, tab and
newline characters.
However, you may wish to consider the
-print0 primary in conjunction with
“xargs -0”
as an effective alternative.
-dfind to perform a depth-first traversal.
This option is a BSD-specific equivalent of the
-depth primary specified by
IEEE Std 1003.1-2001 (“POSIX.1”).
Refer to its description under
PRIMARIES for more information.
-f
path-”.-sfind to traverse the file hierarchies in
lexicographical order, i.e., alphabetical order within each directory.
Note: ‘find -s’ and
‘find | sort’ may give different
results.
For example, ‘find -s’
puts a directory
‘foo’ with
all its contents before a directory
‘foo’. but
‘find | sort’ puts the directory
name ‘foo’.
before any string like
‘foo/bar’
because ‘.’ goes before
‘/’ in ASCII. In locales other
than C results may vary more due to collation
differences.
-xfind from descending into directories that
have a device number different than that of the file from which the
descent began.
This option is equivalent to the deprecated
-xdev primary.
All primaries which take a numeric argument allow the number to be
preceded by a plus sign (“+”) or a
minus sign (“-”). A preceding plus
sign means “more than n”, a preceding minus sign means
“less than n” and neither means “exactly n”.
-Bmin
nfind was started, rounded up to the next full
minute, is n minutes.-Bnewer
file-newerBm.-Btime
n[smhdw]find was started, rounded up to the next full
24-hour period, is n 24-hour periods.
If units are specified, this primary evaluates to true if the
difference between the time of a file's inode creation and the time
find was started is exactly
n units. Please refer to the
-atime primary description for information on
supported time units.
-acl-amin
[-|+]nfind was started, rounded up to the next full
minute, is more than n (+n),
less than n (-n), or exactly
n minutes ago.-anewer
file-neweram.-atime
n[smhdw]find was started, rounded up to the next full
24-hour period, is n 24-hour periods.
If units are specified, this primary evaluates to true if the
difference between the file last access time and the time
find was started is exactly
n units. Possible time units are as follows:
Any number of units may be combined in one
-atime argument, for example,
“-atime -1h30m”. Units are
probably only useful when used in conjunction with the
+ or - modifier.
-cmin
[-|+]nfind was started, rounded
up to the next full minute, is more than n
(+n), less than n
(-n), or exactly n minutes
ago.-cnewer
file-newercm.-ctime
n[smhdw]find was started, rounded up to the next
full 24-hour period, is n 24-hour periods.
If units are specified, this primary evaluates to true if the
difference between the time of last change of file status information
and the time find was started is exactly
n units. Please refer to the
-atime primary description for information on
supported time units.
-ddepth. GNU
find implements this as a primary in mistaken emulation of
FreeBSD find.-deletefind
recurses down the tree. It will not attempt to delete a filename with a
“/” character in its pathname
relative to “.” for security
reasons. Depth-first traversal processing is implied by this option. The
-delete primary will fail to delete a directory if
it is not empty. Following symlinks is incompatible with this option.
WARNING:
The -delete primary will immediately attempt to
delete the current path when evaluated. Be mindful of its place in the
expression; as a general rule, it should almost always come last. If in
doubt, try running with -print in place of
-delete first. See
OPERATORS below for additional
information on the order of evaluation.
-depth-d option.
Cause find to perform a depth-first traversal,
i.e., directories are visited in post-order and all entries in a directory
will be acted on before the directory itself. By default,
find visits directories in pre-order, i.e., before
their contents. Note, the default is not a breadth-first
traversal.
The -depth primary can be useful when
find is used with
cpio(1) to process files that are
contained in directories with unusual permissions. It ensures that you
have write permission while you are placing files in a directory, then
sets the directory's permissions as the last thing.
-depth
n-empty-exec
utility [argument ...]
;;”). If you invoke
find from a shell you may need to quote the
semicolon if the shell would otherwise treat it as a control operator. If
the string “{}” appears anywhere in
the utility name or the arguments it is replaced by the pathname of the
current file. Utility will be executed from the
directory from which find was executed.
Utility and arguments are not
subject to the further expansion of shell patterns and constructs.-exec
utility [argument ...]
{} +-exec, except that
“{}” is replaced with as many
pathnames as possible for each invocation of
utility. This behaviour is similar to that of
xargs(1). The primary always returns
true; if at least one invocation of utility returns
a non-zero exit status, find will return a
non-zero exit status.-execdir
utility [argument ...]
;-execdir primary is identical to the
-exec primary with the exception that
utility will be executed from the directory that
holds the current file. The filename substituted for the string
“{}” is not qualified.-execdir
utility [argument ...]
{} +-execdir, except that
“{}” is replaced with as many
pathnames as possible for each invocation of
utility. This behaviour is similar to that of
xargs(1). The primary always returns
true; if at least one invocation of utility returns
a non-zero exit status, find will return a
non-zero exit status.-flags
[-|+]flags,notflagsno" prefix (except
"nodump") are said to be
notflags. Flags in flags are
checked to be set, and flags in notflags are checked
to be not set. Note that this is different from
-perm, which only allows the user to specify mode
bits that are set.
If flags are preceded by a dash
(“-”), this primary evaluates to
true if at least all of the bits in flags and none
of the bits in notflags are set in the file's
flags bits. If flags are preceded by a plus
(“+”), this primary evaluates to
true if any of the bits in flags is set in the
file's flags bits, or any of the bits in notflags
is not set in the file's flags bits. Otherwise, this primary evaluates
to true if the bits in flags exactly match the
file's flags bits, and none of the flags bits
match those of notflags.
-fstype
typelocal” and
“rdonly”. The former matches any
file system physically mounted on the system where the
find is being executed and the latter matches any
file system which is mounted read-only.-gid
gname-group
gname for compatibility with GNU find. GNU find
imposes a restriction that gname is numeric, while
find does not.-group
gname-ignore_readdir_race-ilname
pattern-lname, but the match is case insensitive.
This is a GNU find extension.-iname
pattern-name, but the match is case
insensitive.-inum
n-ipath
pattern-path, but the match is case
insensitive.-iregex
pattern-regex, but the match is case
insensitive.-iwholename
pattern-ipath, for GNU find
compatibility.-links
n-lname
pattern-name, but the contents of the symbolic link
are matched instead of the file name. Note that this only matches broken
symbolic links if symbolic links are being followed. This is a GNU find
extension.-ls->”. The format is identical to
that produced by
“ls -dgils”.-maxdepth
n-maxdepth
primary is specified, it applies to the entire expression even if it would
not normally be evaluated. “-maxdepth
0” limits the whole search to the command
line arguments.-mindepth
n-mindepth primary
is specified, it applies to the entire expression even if it would not
normally be evaluated. “-mindepth
1” processes all but the command line
arguments.-mmin
[-|+]nfind was started, rounded up to the next full
minute, is more than n (+n),
less than n (-n), or exactly
n minutes ago.-mnewer
file-newer.-mount-xdev, for GNU find
compatibility.-mtime
n[smhdw]find was started, rounded up to the next full
24-hour period, is n 24-hour periods.
If units are specified, this primary evaluates to true if the
difference between the file last modification time and the time
find was started is exactly
n units. Please refer to the
-atime primary description for information on
supported time units.
-name
pattern[”,
“]”,
“*”, and
“?”) may be used as part of
pattern. These characters may be matched explicitly
by escaping them with a backslash
(“\”).-newer
file-newerXY
filea), inode creation time
(X=B), change time
(X=c), or modification time
(X=m) than the last access
time (Y=a), inode creation
time (Y=B), change time
(Y=c), or modification time
(Y=m) of
file. In addition, if
Y=t, then
file is instead interpreted as a direct date
specification of the form understood by ISO8601 or RFC822. Note that
-newermm is equivalent to
-newer.-nogroup-noignore_readdir_race-ignore_readdir_race. This
is default behaviour.-noleaffind, so it is
ignored.-nouser-ok
utility [argument ...]
;-ok primary is identical to the
-exec primary with the exception that
find requests user affirmation for the execution
of the utility by printing a message to the terminal
and reading a response. If the response is not affirmative
(‘y’ in the
“POSIX” locale), the command is not
executed and the value of the -ok expression is
false.-okdir
utility [argument ...]
;-okdir primary is identical to the
-execdir primary with the same exception as
described for the -ok primary.-path
pattern[”,
“]”,
“*”, and
“?”) may be used as part of
pattern. These characters may be matched explicitly
by escaping them with a backslash
(“\”). Slashes
(“/”) are treated as normal
characters and do not have to be matched explicitly.-perm
[-|+]modeS_ISUID | S_ISGID |
S_ISTXT | S_IRWXU |
S_IRWXG | S_IRWXO) of the
file's mode bits participate in the comparison. If the
mode is preceded by a dash
(“-”), this primary evaluates to
true if at least all of the bits in the mode are set
in the file's mode bits. If the mode is preceded by
a plus (“+”), this primary evaluates
to true if any of the bits in the mode are set in
the file's mode bits. Otherwise, this primary evaluates to true if the
bits in the mode exactly match the file's mode bits.
Note, the first character of a symbolic mode may not be a dash
(“-”).-print-exec,
-ls, -print,
-print0, or -ok is
specified, the given expression shall be effectively replaced by
( given expression
) -print.-print0NUL character (character code 0).-prunefind to not descend into the current file. Note,
the -prune primary has no effect if the
-d option was specified.-quitfind to terminate immediately.-regex
pattern.*/[xyz]*” or
“.*/foo/.*”, but not
“xyzzy” or
“/foo/”.-samefile
name-L is specified, it is also true if
the file is a symbolic link and points to name.-size
n[ckMGTP]c, then the primary is true if the file's size is
n bytes (characters). Similarly if
n is followed by a scale indicator then the file's
size is compared to n scaled as:
-sparse-type
t-uid
unamefind
does not.-user
uname-wholename
pattern-path, for GNU find
compatibility.-xattr-xattrname
nameThe primaries may be combined using the following operators. The operators are listed in order of decreasing precedence.
(
expression )!
expression-not
expression-false-true-and
expression-and operator is the logical AND operator. As
it is implied by the juxtaposition of two expressions it does not have to
be specified. The expression evaluates to true if both expressions are
true. The second expression is not evaluated if the first expression is
false.
-or
expression-or operator is the logical OR operator. The
expression evaluates to true if either the first or the second expression
is true. The second expression is not evaluated if the first expression is
true.All operands and primaries must be separate arguments to
find. Primaries which themselves take arguments
expect each argument to be a separate argument to
find.
The LANG, LC_ALL,
LC_COLLATE, LC_CTYPE,
LC_MESSAGES and LC_TIME
environment variables affect the execution of the
find utility as described in
environ(7).
The following examples are shown as given to the shell:
find / \!
-name "*.c" -printfind /
-newer ttt -user wnj -printfind / \!
\( -newer ttt -user wnj \) -printfind / \(
-newer ttt -or -user wnj \) -printfind /
-newerct '1 minute ago' -printfind /
-type f -exec echo {} \;find -L
/usr/ports/packages -type l -exec rm -- {} +find
/usr/src -name CVS -prune -o -depth +6 -printfind
/usr/src -name CVS -prune -o -mindepth 7 -print-prune is not evaluated below level seven.The -follow primary is deprecated; the
-L option should be used instead. See the
STANDARDS section below for details.
chflags(1), chmod(1), locate(1), lsvfs(1), whereis(1), which(1), xargs(1), stat(2), acl(3), fts(3), getgrent(3), getpwent(3), strmode(3), ascii(7), re_format(7), symlink(7)
The find utility syntax is a superset of
the syntax specified by the IEEE Std 1003.1-2001
(“POSIX.1”) standard.
All the single character options except -H
and -L as well as -amin,
-anewer, -cmin,
-cnewer, -delete,
-empty, -fstype,
-iname, -inum,
-iregex, -ls,
-maxdepth, -mindepth,
-mmin, -not,
-path, -print0,
-regex, -sparse and all of
the -B* birthtime related primaries are extensions
to IEEE Std 1003.1-2001
(“POSIX.1”).
Historically, the -d,
-L and -x options were
implemented using the primaries -depth,
-follow, and -xdev. These
primaries always evaluated to true. As they were really global variables
that took effect before the traversal began, some legal expressions could
have unexpected results. An example is the expression
-print -o
-depth. As -print always
evaluates to true, the standard order of evaluation implies that
-depth would never be evaluated. This is not the
case.
The operator -or was implemented as
-o, and the operator -and
was implemented as -a.
Historic implementations of the -exec and
-ok primaries did not replace the string
“{}” in the utility name or the
utility arguments if it had preceding or following non-whitespace
characters. This version replaces it no matter where in the utility name or
arguments it appears.
The -E option was inspired by the
equivalent grep(1) and
sed(1) options.
A simple find command appeared in
Version 1 AT&T UNIX and was removed in
Version 3 AT&T UNIX. It was rewritten for
Version 5 AT&T UNIX and later be enhanced
for the Programmer's Workbench (PWB). These changes were later incorporated
in Version 7 AT&T UNIX.
The special characters used by find are
also special characters to many shell programs. In particular, the
characters “*”,
“[”,
“]”,
“?”,
“(”,
“)”,
“!”,
“\” and
“;” may have to be escaped from the
shell.
As there is no delimiter separating options and file names or file
names and the expression, it is difficult to specify
files named -xdev or !.
These problems are handled by the -f option and the
getopt(3)
“--”
construct.
The -delete primary does not interact well
with other options that cause the file system tree traversal options to be
changed.
The -mindepth and
-maxdepth primaries are actually global options (as
documented above). They should probably be replaced by options which look
like options.
| December 22, 2023 | macOS 15.6 |