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
-L
This option is equivalent to the deprecated
-follow
primary.
-P
-X
find
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.
-d
find
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-
”.-s
find
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.
-x
find
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.
-d
depth
. GNU
find implements this as a primary in mistaken emulation of
FreeBSD find
.-delete
find
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-newer
XY
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.-noleaf
find
, 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
.-print0
NUL
character (character code 0).-prune
find
to not descend into the current file. Note,
the -prune
primary has no effect if the
-d
option was specified.-quit
find
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" -print
find /
-newer ttt -user wnj -print
find / \!
\( -newer ttt -user wnj \) -print
find / \(
-newer ttt -or -user wnj \) -print
find /
-newerct '1 minute ago' -print
find /
-type f -exec echo {} \;
find -L
/usr/ports/packages -type l -exec rm -- {} +
find
/usr/src -name CVS -prune -o -depth +6 -print
find
/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.2 |