FIND(1) | General Commands Manual | FIND(1) |
find
— walk a file
hierarchy
find |
[-dHhLXx ] [-f
path] path ...
[expression] |
find
recursively descends the directory
tree for each path listed, evaluating an
expression (composed of the “primaries”
and “operators” listed below) in terms of each file in the
tree. In the absence of an expression, -print
is
assumed. If an expression is given, but none of the primaries
-delete
, -exec
,
-execdir
, -ls
,
-ok
, -print
, or
-print0
are specified, the given expression is
effectively replaced by (
given
expression )
-print
.
The options are as follows:
-d
find
to visit directories in post-order
i.e. 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.-f
pathfind
to traverse.
File hierarchies may be specified without the -f
option if they are given immediately after any other options.-H
-h
-L
option. This option exists for
backwards compatibility.-L
-X
find
to be safely used in conjunction with
xargs(1). If a file name contains any of
the delimiting characters used by xargs, 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
(‘\n’) characters. Consider using
-print0
instead.-x
find
from descending into directories
that have a device number different than that of the file from which the
descent began.It is not an error to specify more than one of the mutually
exclusive options -H
and -L
.
Where more than one of these options is specified, the last option given
overrides the others.
-amin
nfind
was started, rounded up to the next full
minute, is n minutes.
-anewer
file-atime
nfind
was started, rounded up to the next full
24-hour period, is n 24-hour periods.
-cmin
nfind
was started, rounded
up to the next full minute, is n minutes.
-cnewer
file-ctime
nfind
was started, rounded
up to the next full 24-hour period, is n 24-hour
periods.
-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.
-depth
-d
option.
-empty
-exec
utility [argument ...] ;-exec
utility [argument ...] {} +;
’) or a plus sign
(‘+
’).
If terminated by a semicolon, the utility is executed once per path. This form of the primary evaluates to true if utility exits with a zero exit status. If the string "{}" appears anywhere in the utility name or the arguments it is replaced by the pathname of the current file.
If terminated by a plus sign, the pathnames for which the
primary is evaluated are aggregated into sets, and
utility will be invoked once per set, similar to
xargs(1). This form of the primary
always evaluates to true. If any invocation exits with a non-zero exit
status, then find
will eventually do so as well,
but this does not cause find
to exit early. The
string "{}" must appear, and must appear last. Each set is
limited to no more than 5,000 pathnames, and is also limited such that
the invocation of utility does not exceed
ARG_MAX
.
-execdir
utility [argument ...] ;-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.
-flags
[-]flags-follow
-L
option.
-fstype
typefind
is being executed
whereas the latter matches any file system which is mounted read-only.
-group
gname-iname
pattern-name
primary except that the
matching is done in a case insensitive manner.
-inum
n-links
n-ls
-maxdepth
n-mindepth
n-mmin
nfind
was started, rounded up to the next full
minute, is n minutes.
-mtime
nfind
was started, rounded up to the next full
24-hour period, is n 24-hour periods.
-name
pattern-newer
file-nogroup
-nouser
-ok
utility [argument ...] ;-exec
primary with the exception
that find
requests user affirmation for the
execution of utility by printing a message to the
terminal and reading a response. If the response is other than
‘y’ the command is not executed and the value of the
ok
expression is false.
-path
pattern/
’) 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
not preceded by a dash, 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
\n
’) character.
-print0
-0
option to
xargs(1).
-prune
find
to not descend into the current file. Note,
the -prune
primary has no effect if the
-d
option was specified.
-size
n[c
]-type
t-user
uname-xdev
-x
option.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”.
Exceptions are the primaries mindepth
and
maxdepth
.
The primaries may be combined using the following operators. The operators are listed in order of decreasing precedence.
(
expression )
!
expression-not
expression-a
expression-and
expression-o
expression-or
expressionOperators, primaries, and arguments to primaries must be separate
arguments to find
, i.e. they should be separated by
whitespace.
The find
utility exits with a value of 0
on successful traversal of all path operands or with a value >0 if an
error occurred.
Print out a list of all the files whose names end in “.c”:
$ find / -name '*.c'
Print out a list of all the files which are not both newer than “ttt” and owned by “wnj”:
$ find / ! \( -newer ttt -user wnj
\)
Print out a list of all core files on local file systems:
$ find / ! -fstype local -prune -o
-name '*.core'
Find all files in /usr/src ending in a dot and single digit, but skip directory /usr/src/gnu:
$ find /usr/src -path /usr/src/gnu
-prune -o -name \*.[0-9]
Find and remove all *.jpg and *.gif files under the current working directory:
$ find . \( -name \*.jpg -o -name
\*.gif \) -exec rm {} +
$ find . \( -name \*.jpg -o -name
\*.gif \) -delete
chflags(1), chmod(1), locate(1), ls(1), whereis(1), which(1), xargs(1), stat(2), fts_open(3), glob(7), symlink(7)
The find
utility is compliant with the
IEEE Std 1003.1-2008 (“POSIX.1”)
specification.
The options [-dfhXx
], primaries
-amin
, -anewer
,
-cmin
, -cnewer
,
-delete
, -empty
,
-execdir
, -flags
,
-follow
, -fstype
,
-iname
, -inum
,
-ls
, -maxdepth
,
-mindepth
, -mmin
, and
-print0
, and operators -and
,
-not
, and -or
, are
extensions to that specification.
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.
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.
A find
command appeared in
Version 1 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 file names may contain whitespace and shell metacharacters,
passing the output of find
to other programs
requires some care:
$ find . -name \*.jpg | xargs
rm
$ rm `find . -name
\*.jpg`
would, given files “important .jpg” and
“important”, remove “important”. Use the
-print0
or -exec
primaries
instead.
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.
August 14, 2020 | OpenBSD-current |