summaryrefslogtreecommitdiff
path: root/doc/find.info-1
diff options
context:
space:
mode:
Diffstat (limited to 'doc/find.info-1')
-rw-r--r--doc/find.info-11581
1 files changed, 1581 insertions, 0 deletions
diff --git a/doc/find.info-1 b/doc/find.info-1
new file mode 100644
index 00000000..dc78df66
--- /dev/null
+++ b/doc/find.info-1
@@ -0,0 +1,1581 @@
+This is Info file find.info, produced by Makeinfo-1.55 from the input
+file find.texi.
+
+START-INFO-DIR-ENTRY
+* Finding Files: (find). Listing and operating on files
+ that match certain criteria.
+END-INFO-DIR-ENTRY
+
+ This file documents the GNU utilities for finding files that match
+certain criteria and performing various operations on them.
+
+ Copyright (C) 1994 Free Software Foundation, Inc.
+
+ Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+ Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+ Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Foundation.
+
+
+File: find.info, Node: Top, Next: Introduction, Up: (dir)
+
+ This file documents the GNU utilities for finding files that match
+certain criteria and performing various actions on them. This is
+edition 1.1, for `find' version 4.1.
+
+* Menu:
+
+* Introduction:: Summary of the tasks this manual describes.
+* Finding Files:: Finding files that match certain criteria.
+* Actions:: Doing things to files you have found.
+* Common Tasks:: Solutions to common real-world problems.
+* Databases:: Maintaining file name databases.
+* File Permissions:: How to control access to files.
+* Reference:: Summary of how to invoke the programs.
+* Primary Index:: The components of `find' expressions.
+
+
+File: find.info, Node: Introduction, Next: Finding Files, Prev: Top, Up: Top
+
+Introduction
+************
+
+ This manual shows how to find files that meet criteria you specify,
+and how to perform various actions on the files that you find. The
+principal programs that you use to perform these tasks are `find',
+`locate', and `xargs'. Some of the examples in this manual use
+capabilities specific to the GNU versions of those programs.
+
+ GNU `find' was originally written by Eric Decker, with enhancements
+by David MacKenzie, Jay Plett, and Tim Wood. GNU `xargs' was
+originally written by Mike Rendell, with enhancements by David
+MacKenzie. GNU `locate' and its associated utilities were originally
+written by James Woods, with enhancements by David MacKenzie. The idea
+for `find -print0' and `xargs -0' came from Dan Bernstein. Many other
+people have contributed bug fixes, small improvements, and helpful
+suggestions. Thanks!
+
+ Mail suggestions and bug reports for these programs to
+`bug-gnu-utils@prep.ai.mit.edu'. Please include the version number,
+which you can get by running `find --version'.
+
+* Menu:
+
+* Scope::
+* Overview::
+* find Expressions::
+
+
+File: find.info, Node: Scope, Next: Overview, Up: Introduction
+
+Scope
+=====
+
+ For brevity, the word "file" in this manual means a regular file, a
+directory, a symbolic link, or any other kind of node that has a
+directory entry. A directory entry is also called a "file name". A
+file name may contain some, all, or none of the directories in a path
+that leads to the file. These are all examples of what this manual
+calls "file names":
+
+ parser.c
+ README
+ ./budget/may-94.sc
+ fred/.cshrc
+ /usr/local/include/termcap.h
+
+ A "directory tree" is a directory and the files it contains, all of
+its subdirectories and the files they contain, etc. It can also be a
+single non-directory file.
+
+ These programs enable you to find the files in one or more directory
+trees that:
+
+ * have names that contain certain text or match a certain pattern;
+
+ * are links to certain files;
+
+ * were last used during a certain period of time;
+
+ * are within a certain size range;
+
+ * are of a certain type (regular file, directory, symbolic link,
+ etc.);
+
+ * are owned by a certain user or group;
+
+ * have certain access permissions;
+
+ * contain text that matches a certain pattern;
+
+ * are within a certain depth in the directory tree;
+
+ * or some combination of the above.
+
+ Once you have found the files you're looking for (or files that are
+potentially the ones you're looking for), you can do more to them than
+simply list their names. You can get any combination of the files'
+attributes, or process the files in many ways, either individually or in
+groups of various sizes. Actions that you might want to perform on the
+files you have found include, but are not limited to:
+
+ * view or edit
+
+ * store in an archive
+
+ * remove or rename
+
+ * change access permissions
+
+ * classify into groups
+
+ This manual describes how to perform each of those tasks, and more.
+
+
+File: find.info, Node: Overview, Next: find Expressions, Prev: Scope, Up: Introduction
+
+Overview
+========
+
+ The principal programs used for making lists of files that match
+given criteria and running commands on them are `find', `locate', and
+`xargs'. An additional command, `updatedb', is used by system
+administrators to create databases for `locate' to use.
+
+ `find' searches for files in a directory hierarchy and prints
+information about the files it found. It is run like this:
+
+ find [FILE...] [EXPRESSION]
+
+Here is a typical use of `find'. This example prints the names of all
+files in the directory tree rooted in `/usr/src' whose name ends with
+`.c' and that are larger than 100 Kilobytes.
+ find /usr/src -name '*.c' -size +100k -print
+
+ `locate' searches special file name databases for file names that
+match patterns. The system administrator runs the `updatedb' program
+to create the databases. `locate' is run like this:
+
+ locate [OPTION...] PATTERN...
+
+This example prints the names of all files in the default file name
+database whose name ends with `Makefile' or `makefile'. Which file
+names are stored in the database depends on how the system
+administrator ran `updatedb'.
+ locate '*[Mm]akefile'
+
+ The name `xargs', pronounced EX-args, means "combine arguments."
+`xargs' builds and executes command lines by gathering together
+arguments it reads on the standard input. Most often, these arguments
+are lists of file names generated by `find'. `xargs' is run like this:
+
+ xargs [OPTION...] [COMMAND [INITIAL-ARGUMENTS]]
+
+The following command searches the files listed in the file `file-list'
+and prints all of the lines in them that contain the word `typedef'.
+ xargs grep typedef < file-list
+
+
+File: find.info, Node: find Expressions, Prev: Overview, Up: Introduction
+
+`find' Expressions
+==================
+
+ The expression that `find' uses to select files consists of one or
+more "primaries", each of which is a separate command line argument to
+`find'. `find' evaluates the expression each time it processes a file.
+An expression can contain any of the following types of primaries:
+
+"options"
+ affect overall operation rather than the processing of a specific
+ file;
+
+"tests"
+ return a true or false value, depending on the file's attributes;
+
+"actions"
+ have side effects and return a true or false value; and
+
+"operators"
+ connect the other arguments and affect when and whether they are
+ evaluated.
+
+ You can omit the operator between two primaries; it defaults to
+`-and'. *Note Combining Primaries With Operators::, for ways to
+connect primaries into more complex expressions. If the expression
+contains no actions other than `-prune', `-print' is performed on all
+files for which the entire expression is true (*note Print File
+Name::.).
+
+ Options take effect immediately, rather than being evaluated for each
+file when their place in the expression is reached. Therefore, for
+clarity, it is best to place them at the beginning of the expression.
+
+ Many of the primaries take arguments, which immediately follow them
+in the next command line argument to `find'. Some arguments are file
+names, patterns, or other strings; others are numbers. Numeric
+arguments can be specified as
+
+`+N'
+ for greater than N,
+
+`-N'
+ for less than N,
+
+`N'
+ for exactly N.
+
+
+File: find.info, Node: Finding Files, Next: Actions, Prev: Introduction, Up: Top
+
+Finding Files
+*************
+
+ By default, `find' prints to the standard output the names of the
+files that match the given criteria. *Note Actions::, for how to get
+more information about the matching files.
+
+* Menu:
+
+* Name::
+* Links::
+* Time::
+* Size::
+* Type::
+* Owner::
+* Permissions::
+* Contents::
+* Directories::
+* Filesystems::
+* Combining Primaries With Operators::
+
+
+File: find.info, Node: Name, Next: Links, Up: Finding Files
+
+Name
+====
+
+ Here are ways to search for files whose name matches a certain
+pattern. *Note Shell Pattern Matching::, for a description of the
+PATTERN arguments to these tests.
+
+ Each of these tests has a case-sensitive version and a
+case-insensitive version, whose name begins with `i'. In a
+case-insensitive comparison, the patterns `fo*' and `F??' match the
+file names `Foo', `FOO', `foo', `fOo', etc.
+
+* Menu:
+
+* Base Name Patterns::
+* Full Name Patterns::
+* Fast Full Name Search::
+* Shell Pattern Matching:: Wildcards used by these programs.
+
+
+File: find.info, Node: Base Name Patterns, Next: Full Name Patterns, Up: Name
+
+Base Name Patterns
+------------------
+
+ - Test: -name PATTERN
+ - Test: -iname PATTERN
+ True if the base of the file name (the path with the leading
+ directories removed) matches shell pattern PATTERN. For `-iname',
+ the match is case-insensitive. To ignore a whole directory tree,
+ use `-prune' (*note Directories::.). As an example, to find
+ Texinfo source files in `/usr/local/doc':
+
+ find /usr/local/doc -name '*.texi'
+
+
+File: find.info, Node: Full Name Patterns, Next: Fast Full Name Search, Prev: Base Name Patterns, Up: Name
+
+Full Name Patterns
+------------------
+
+ - Test: -path PATTERN
+ - Test: -ipath PATTERN
+ True if the entire file name, starting with the command line
+ argument under which the file was found, matches shell pattern
+ PATTERN. For `-ipath', the match is case-insensitive. To ignore
+ a whole directory tree, use `-prune' rather than checking every
+ file in the tree (*note Directories::.).
+
+ - Test: -regex EXPR
+ - Test: -iregex EXPR
+ True if the entire file name matches regular expression EXPR.
+ This is a match on the whole path, not a search. For example, to
+ match a file named `./fubar3', you can use the regular expression
+ `.*bar.' or `.*b.*3', but not `b.*r3'. *Note Syntax of Regular
+ Expressions: (emacs)Regexps, for a description of the syntax of
+ regular expressions. For `-iregex', the match is case-insensitive.
+
+
+File: find.info, Node: Fast Full Name Search, Next: Shell Pattern Matching, Prev: Full Name Patterns, Up: Name
+
+Fast Full Name Search
+---------------------
+
+ To search for files by name without having to actually scan the
+directories on the disk (which can be slow), you can use the `locate'
+program. For each shell pattern you give it, `locate' searches one or
+more databases of file names and displays the file names that contain
+the pattern. *Note Shell Pattern Matching::, for details about shell
+patterns.
+
+ If a pattern is a plain string--it contains no
+metacharacters--`locate' displays all file names in the database that
+contain that string. If a pattern contains metacharacters, `locate'
+only displays file names that match the pattern exactly. As a result,
+patterns that contain metacharacters should usually begin with a `*',
+and will most often end with one as well. The exceptions are patterns
+that are intended to explicitly match the beginning or end of a file
+name.
+
+ The command
+ locate PATTERN
+
+ is almost equivalent to
+ find DIRECTORIES -name PATTERN
+
+ where DIRECTORIES are the directories for which the file name
+databases contain information. The differences are that the `locate'
+information might be out of date, and that `locate' handles wildcards
+in the pattern slightly differently than `find' (*note Shell Pattern
+Matching::.).
+
+ The file name databases contain lists of files that were on the
+system when the databases were last updated. The system administrator
+can choose the file name of the default database, the frequency with
+which the databases are updated, and the directories for which they
+contain entries.
+
+ Here is how to select which file name databases `locate' searches.
+The default is system-dependent.
+
+`--database=PATH'
+`-d PATH'
+ Instead of searching the default file name database, search the
+ file name databases in PATH, which is a colon-separated list of
+ database file names. You can also use the environment variable
+ `LOCATE_PATH' to set the list of database files to search. The
+ option overrides the environment variable if both are used.
+
+
+File: find.info, Node: Shell Pattern Matching, Prev: Fast Full Name Search, Up: Name
+
+Shell Pattern Matching
+----------------------
+
+ `find' and `locate' can compare file names, or parts of file names,
+to shell patterns. A "shell pattern" is a string that may contain the
+following special characters, which are known as "wildcards" or
+"metacharacters".
+
+ You must quote patterns that contain metacharacters to prevent the
+shell from expanding them itself. Double and single quotes both work;
+so does escaping with a backslash.
+
+`*'
+ Matches any zero or more characters.
+
+`?'
+ Matches any one character.
+
+`[STRING]'
+ Matches exactly one character that is a member of the string
+ STRING. This is called a "character class". As a shorthand,
+ STRING may contain ranges, which consist of two characters with a
+ dash between them. For example, the class `[a-z0-9_]' matches a
+ lowercase letter, a number, or an underscore. You can negate a
+ class by placing a `!' or `^' immediately after the opening
+ bracket. Thus, `[^A-Z@]' matches any character except an
+ uppercase letter or an at sign.
+
+`\'
+ Removes the special meaning of the character that follows it. This
+ works even in character classes.
+
+ In the `find' tests that do shell pattern matching (`-name',
+`-path', etc.), wildcards in the pattern do not match a `.' at the
+beginning of a file name. This is not the case for `locate'. Thus,
+`find -name '*macs'' does not match a file named `.emacs', but `locate
+'*macs'' does.
+
+ Slash characters have no special significance in the shell pattern
+matching that `find' and `locate' do, unlike in the shell, in which
+wildcards do not match them. Therefore, a pattern `foo*bar' can match
+a file name `foo3/bar', and a pattern `./sr*sc' can match a file name
+`./src/misc'.
+
+
+File: find.info, Node: Links, Next: Time, Prev: Name, Up: Finding Files
+
+Links
+=====
+
+ There are two ways that files can be linked together. "Symbolic
+links" are a special type of file whose contents are a portion of the
+name of another file. "Hard links" are multiple directory entries for
+one file; the file names all have the same index node ("inode") number
+on the disk.
+
+* Menu:
+
+* Symbolic Links::
+* Hard Links::
+
+
+File: find.info, Node: Symbolic Links, Next: Hard Links, Up: Links
+
+Symbolic Links
+--------------
+
+ - Test: -lname PATTERN
+ - Test: -ilname PATTERN
+ True if the file is a symbolic link whose contents match shell
+ pattern PATTERN. For `-ilname', the match is case-insensitive.
+ *Note Shell Pattern Matching::, for details about the PATTERN
+ argument. So, to list any symbolic links to `sysdep.c' in the
+ current directory and its subdirectories, you can do:
+
+ find . -lname '*sysdep.c'
+
+ - Option: -follow
+ Dereference symbolic links. The following differences in behavior
+ occur when this option is given:
+
+ * `find' follows symbolic links to directories when searching
+ directory trees.
+
+ * `-lname' and `-ilname' always return false.
+
+ * `-type' reports the types of the files that symbolic links
+ point to.
+
+ * Implies `-noleaf' (*note Directories::.).
+
+
+File: find.info, Node: Hard Links, Prev: Symbolic Links, Up: Links
+
+Hard Links
+----------
+
+ To find hard links, first get the inode number of the file whose
+links you want to find. You can learn a file's inode number and the
+number of links to it by running `ls -i' or `find -ls'. If the file has
+more than one link, you can search for the other links by passing that
+inode number to `-inum'. Add the `-xdev' option if you are starting
+the search at a directory that has other filesystems mounted on it,
+such as `/usr' on many systems. Doing this saves needless searching,
+since hard links to a file must be on the same filesystem. *Note
+Filesystems::.
+
+ - Test: -inum N
+ File has inode number N.
+
+ You can also search for files that have a certain number of links,
+with `-links'. Directories normally have at least two hard links; their
+`.' entry is the second one. If they have subdirectories, each of
+those also has a hard link called `..' to its parent directory.
+
+ - Test: -links N
+ File has N hard links.
+
+
+File: find.info, Node: Time, Next: Size, Prev: Links, Up: Finding Files
+
+Time
+====
+
+ Each file has three time stamps, which record the last time that
+certain operations were performed on the file:
+
+ 1. access (read the file's contents)
+
+ 2. change the status (modify the file or its attributes)
+
+ 3. modify (change the file's contents)
+
+ You can search for files whose time stamps are within a certain age
+range, or compare them to other time stamps.
+
+* Menu:
+
+* Age Ranges::
+* Comparing Timestamps::
+
+
+File: find.info, Node: Age Ranges, Next: Comparing Timestamps, Up: Time
+
+Age Ranges
+----------
+
+ These tests are mainly useful with ranges (`+N' and `-N').
+
+ - Test: -atime N
+ - Test: -ctime N
+ - Test: -mtime N
+ True if the file was last accessed (or its status changed, or it
+ was modified) N*24 hours ago.
+
+ - Test: -amin N
+ - Test: -cmin N
+ - Test: -mmin N
+ True if the file was last accessed (or its status changed, or it
+ was modified) N minutes ago. These tests provide finer
+ granularity of measurement than `-atime' et al. For example, to
+ list files in `/u/bill' that were last read from 2 to 6 hours ago:
+
+ find /u/bill -amin +2 -amin -6
+
+ - Option: -daystart
+ Measure times from the beginning of today rather than from 24
+ hours ago. So, to list the regular files in your home directory
+ that were modified yesterday, do
+
+ find ~ -daystart -type f -mtime 1
+
+
+File: find.info, Node: Comparing Timestamps, Prev: Age Ranges, Up: Time
+
+Comparing Timestamps
+--------------------
+
+ As an alternative to comparing timestamps to the current time, you
+can compare them to another file's timestamp. That file's timestamp
+could be updated by another program when some event occurs. Or you
+could set it to a particular fixed date using the `touch' command. For
+example, to list files in `/usr' modified after February 1 of the
+current year:
+
+ touch -t 02010000 /tmp/stamp$$
+ find /usr -newer /tmp/stamp$$
+ rm -f /tmp/stamp$$
+
+ - Test: -anewer FILE
+ - Test: -cnewer FILE
+ - Test: -newer FILE
+ True if the file was last accessed (or its status changed, or it
+ was modified) more recently than FILE was modified. These tests
+ are affected by `-follow' only if `-follow' comes before them on
+ the command line. *Note Symbolic Links::, for more information on
+ `-follow'. As an example, to list any files modified since
+ `/bin/sh' was last modified:
+
+ find . -newer /bin/sh
+
+ - Test: -used N
+ True if the file was last accessed N days after its status was
+ last changed. Useful for finding files that are not being used,
+ and could perhaps be archived or removed to save disk space.
+
+
+File: find.info, Node: Size, Next: Type, Prev: Time, Up: Finding Files
+
+Size
+====
+
+ - Test: -size N[BCKW]
+ True if the file uses N units of space, rounding up. The units
+ are 512-byte blocks by default, but they can be changed by adding a
+ one-character suffix to N:
+
+ `b'
+ 512-byte blocks
+
+ `c'
+ bytes
+
+ `k'
+ kilobytes (1024 bytes)
+
+ `w'
+ 2-byte words
+
+ The size does not count indirect blocks, but it does count blocks
+ in sparse files that are not actually allocated.
+
+ - Test: -empty
+ True if the file is empty and is either a regular file or a
+ directory. This might make it a good candidate for deletion.
+ This test is useful with `-depth' (*note Directories::.) and
+ `-exec rm -rf '{}' ';'' (*note Single File::.).
+
+
+File: find.info, Node: Type, Next: Owner, Prev: Size, Up: Finding Files
+
+Type
+====
+
+ - Test: -type C
+ True if the file is of type C:
+
+ `b'
+ block (buffered) special
+
+ `c'
+ character (unbuffered) special
+
+ `d'
+ directory
+
+ `p'
+ named pipe (FIFO)
+
+ `f'
+ regular file
+
+ `l'
+ symbolic link
+
+ `s'
+ socket
+
+ - Test: -xtype C
+ The same as `-type' unless the file is a symbolic link. For
+ symbolic links: if `-follow' has not been given, true if the file
+ is a link to a file of type C; if `-follow' has been given, true
+ if C is `l'. In other words, for symbolic links, `-xtype' checks
+ the type of the file that `-type' does not check. *Note Symbolic
+ Links::, for more information on `-follow'.
+
+
+File: find.info, Node: Owner, Next: Permissions, Prev: Type, Up: Finding Files
+
+Owner
+=====
+
+ - Test: -user UNAME
+ - Test: -group GNAME
+ True if the file is owned by user UNAME (belongs to group GNAME).
+ A numeric ID is allowed.
+
+ - Test: -uid N
+ - Test: -gid N
+ True if the file's numeric user ID (group ID) is N. These tests
+ support ranges (`+N' and `-N'), unlike `-user' and `-group'.
+
+ - Test: -nouser
+ - Test: -nogroup
+ True if no user corresponds to the file's numeric user ID (no group
+ corresponds to the numeric group ID). These cases usually mean
+ that the files belonged to users who have since been removed from
+ the system. You probably should change the ownership of such
+ files to an existing user or group, using the `chown' or `chgrp'
+ program.
+
+
+File: find.info, Node: Permissions, Next: Contents, Prev: Owner, Up: Finding Files
+
+Permissions
+===========
+
+ *Note File Permissions::, for information on how file permissions are
+structured and how to specify them.
+
+ - Test: -perm MODE
+ True if the file's permissions are exactly MODE (which can be
+ numeric or symbolic). Symbolic modes use mode 0 as a point of
+ departure. If MODE starts with `-', true if *all* of the
+ permissions set in MODE are set for the file; permissions not set
+ in MODE are ignored. If MODE starts with `+', true if *any* of
+ the permissions set in MODE are set for the file; permissions not
+ set in MODE are ignored.
+
+
+File: find.info, Node: Contents, Next: Directories, Prev: Permissions, Up: Finding Files
+
+Contents
+========
+
+ To search for files based on their contents, you can use the `grep'
+program. For example, to find out which C source files in the current
+directory contain the string `thing', you can do:
+
+ grep -l thing *.[ch]
+
+ If you also want to search for the string in files in subdirectories,
+you can combine `grep' with `find' and `xargs', like this:
+
+ find . -name '*.[ch]' | xargs grep -l thing
+
+ The `-l' option causes `grep' to print only the names of files that
+contain the string, rather than the lines that contain it. The string
+argument (`thing') is actually a regular expression, so it can contain
+metacharacters. This method can be refined a little by using the `-r'
+option to make `xargs' not run `grep' if `find' produces no output, and
+using the `find' action `-print0' and the `xargs' option `-0' to avoid
+misinterpreting files whose names contain spaces:
+
+ find . -name '*.[ch]' -print0 | xargs -r -0 grep -l thing
+
+ For a fuller treatment of finding files whose contents match a
+pattern, see the manual page for `grep'.
+
+
+File: find.info, Node: Directories, Next: Filesystems, Prev: Contents, Up: Finding Files
+
+Directories
+===========
+
+ Here is how to control which directories `find' searches, and how it
+searches them. These two options allow you to process a horizontal
+slice of a directory tree.
+
+ - Option: -maxdepth LEVELS
+ Descend at most LEVELS (a non-negative integer) levels of
+ directories below the command line arguments. `-maxdepth 0' means
+ only apply the tests and actions to the command line arguments.
+
+ - Option: -mindepth LEVELS
+ Do not apply any tests or actions at levels less than LEVELS (a
+ non-negative integer). `-mindepth 1' means process all files
+ except the command line arguments.
+
+ - Option: -depth
+ Process each directory's contents before the directory itself.
+ Doing this is a good idea when producing lists of files to archive
+ with `cpio' or `tar'. If a directory does not have write
+ permission for its owner, its contents can still be restored from
+ the archive since the directory's permissions are restored after
+ its contents.
+
+ - Action: -prune
+ If `-depth' is not given, true; do not descend the current
+ directory. If `-depth' is given, false; no effect. `-prune' only
+ affects tests and actions that come after it in the expression, not
+ those that come before.
+
+ For example, to skip the directory `src/emacs' and all files and
+ directories under it, and print the names of the other files found:
+
+ find . -path './src/emacs' -prune -o -print
+
+ - Option: -noleaf
+ Do not optimize by assuming that directories contain 2 fewer
+ subdirectories than their hard link count. This option is needed
+ when searching filesystems that do not follow the Unix
+ directory-link convention, such as CD-ROM or MS-DOS filesystems or
+ AFS volume mount points. Each directory on a normal Unix
+ filesystem has at least 2 hard links: its name and its `.' entry.
+ Additionally, its subdirectories (if any) each have a `..' entry
+ linked to that directory. When `find' is examining a directory,
+ after it has statted 2 fewer subdirectories than the directory's
+ link count, it knows that the rest of the entries in the directory
+ are non-directories ("leaf" files in the directory tree). If only
+ the files' names need to be examined, there is no need to stat
+ them; this gives a significant increase in search speed.
+
+
+File: find.info, Node: Filesystems, Next: Combining Primaries With Operators, Prev: Directories, Up: Finding Files
+
+Filesystems
+===========
+
+ A "filesystem" is a section of a disk, either on the local host or
+mounted from a remote host over a network. Searching network
+filesystems can be slow, so it is common to make `find' avoid them.
+
+ There are two ways to avoid searching certain filesystems. One way
+is to tell `find' to only search one filesystem:
+
+ - Option: -xdev
+ - Option: -mount
+ Don't descend directories on other filesystems. These options are
+ synonyms.
+
+ The other way is to check the type of filesystem each file is on, and
+not descend directories that are on undesirable filesystem types:
+
+ - Test: -fstype TYPE
+ True if the file is on a filesystem of type TYPE. The valid
+ filesystem types vary among different versions of Unix; an
+ incomplete list of filesystem types that are accepted on some
+ version of Unix or another is:
+ ufs 4.2 4.3 nfs tmp mfs S51K S52K
+ You can use `-printf' with the `%F' directive to see the types of
+ your filesystems. *Note Print File Information::. `-fstype' is
+ usually used with `-prune' to avoid searching remote filesystems
+ (*note Directories::.).
+
+
+File: find.info, Node: Combining Primaries With Operators, Prev: Filesystems, Up: Finding Files
+
+Combining Primaries With Operators
+==================================
+
+ Operators build a complex expression from tests and actions. The
+operators are, in order of decreasing precedence:
+
+`( EXPR )'
+ Force precedence. True if EXPR is true.
+
+`! EXPR'
+`-not EXPR'
+ True if EXPR is false.
+
+`EXPR1 EXPR2'
+`EXPR1 -a EXPR2'
+`EXPR1 -and EXPR2'
+ And; EXPR2 is not evaluated if EXPR1 is false.
+
+`EXPR1 -o EXPR2'
+`EXPR1 -or EXPR2'
+ Or; EXPR2 is not evaluated if EXPR1 is true.
+
+`EXPR1 , EXPR2'
+ List; both EXPR1 and EXPR2 are always evaluated. True if EXPR2 is
+ true. The value of EXPR1 is discarded. This operator lets you do
+ multiple independent operations on one traversal, without
+ depending on whether other operations succeeded.
+
+ `find' searches the directory tree rooted at each file name by
+evaluating the expression from left to right, according to the rules of
+precedence, until the outcome is known (the left hand side is false for
+`-and', true for `-or'), at which point `find' moves on to the next
+file name.
+
+ There are two other tests that can be useful in complex expressions:
+
+ - Test: -true
+ Always true.
+
+ - Test: -false
+ Always false.
+
+
+File: find.info, Node: Actions, Next: Common Tasks, Prev: Finding Files, Up: Top
+
+Actions
+*******
+
+ There are several ways you can print information about the files that
+match the criteria you gave in the `find' expression. You can print
+the information either to the standard output or to a file that you
+name. You can also execute commands that have the file names as
+arguments. You can use those commands as further filters to select
+files.
+
+* Menu:
+
+* Print File Name::
+* Print File Information::
+* Run Commands::
+* Adding Tests::
+
+
+File: find.info, Node: Print File Name, Next: Print File Information, Up: Actions
+
+Print File Name
+===============
+
+ - Action: -print
+ True; print the full file name on the standard output, followed by
+ a newline.
+
+ - Action: -fprint FILE
+ True; print the full file name into file FILE, followed by a
+ newline. If FILE does not exist when `find' is run, it is
+ created; if it does exist, it is truncated to 0 bytes. The file
+ names `/dev/stdout' and `/dev/stderr' are handled specially; they
+ refer to the standard output and standard error output,
+ respectively.
+
+
+File: find.info, Node: Print File Information, Next: Run Commands, Prev: Print File Name, Up: Actions
+
+Print File Information
+======================
+
+ - Action: -ls
+ True; list the current file in `ls -dils' format on the standard
+ output. The output looks like this:
+
+ 204744 17 -rw-r--r-- 1 djm staff 17337 Nov 2 1992 ./lwall-quotes
+
+ The fields are:
+
+ 1. The inode number of the file. *Note Hard Links::, for how to
+ find files based on their inode number.
+
+ 2. the number of blocks in the file. The block counts are of 1K
+ blocks, unless the environment variable `POSIXLY_CORRECT' is
+ set, in which case 512-byte blocks are used. *Note Size::,
+ for how to find files based on their size.
+
+ 3. The file's type and permissions. The type is shown as a dash
+ for a regular file; for other file types, a letter like for
+ `-type' is used (*note Type::.). The permissions are read,
+ write, and execute for the file's owner, its group, and other
+ users, respectively; a dash means the permission is not
+ granted. *Note File Permissions::, for more details about
+ file permissions. *Note Permissions::, for how to find files
+ based on their permissions.
+
+ 4. The number of hard links to the file.
+
+ 5. The user who owns the file.
+
+ 6. The file's group.
+
+ 7. The file's size in bytes.
+
+ 8. The date the file was last modified.
+
+ 9. The file's name. `-ls' quotes non-printable characters in
+ the file names using C-like backslash escapes.
+
+ - Action: -fls FILE
+ True; like `-ls' but write to FILE like `-fprint' (*note Print
+ File Name::.).
+
+ - Action: -printf FORMAT
+ True; print FORMAT on the standard output, interpreting `\'
+ escapes and `%' directives. Field widths and precisions can be
+ specified as with the `printf' C function. Unlike `-print',
+ `-printf' does not add a newline at the end of the string.
+
+ - Action: -fprintf FILE FORMAT
+ True; like `-printf' but write to FILE like `-fprint' (*note Print
+ File Name::.).
+
+* Menu:
+
+* Escapes::
+* Format Directives::
+* Time Formats::
+
+
+File: find.info, Node: Escapes, Next: Format Directives, Up: Print File Information
+
+Escapes
+-------
+
+ The escapes that `-printf' and `-fprintf' recognize are:
+
+`\a'
+ Alarm bell.
+
+`\b'
+ Backspace.
+
+`\c'
+ Stop printing from this format immediately and flush the output.
+
+`\f'
+ Form feed.
+
+`\n'
+ Newline.
+
+`\r'
+ Carriage return.
+
+`\t'
+ Horizontal tab.
+
+`\v'
+ Vertical tab.
+
+`\\'
+ A literal backslash (`\').
+
+ A `\' character followed by any other character is treated as an
+ordinary character, so they both are printed, and a warning message is
+printed to the standard error output (because it was probably a typo).
+
+
+File: find.info, Node: Format Directives, Next: Time Formats, Prev: Escapes, Up: Print File Information
+
+Format Directives
+-----------------
+
+ `-printf' and `-fprintf' support the following format directives to
+print information about the file being processed. Unlike the C
+`printf' function, they do not support field width specifiers.
+
+ `%%' is a literal percent sign. A `%' character followed by any
+other character is discarded (but the other character is printed), and
+a warning message is printed to the standard error output (because it
+was probably a typo).
+
+* Menu:
+
+* Name Directives::
+* Ownership Directives::
+* Size Directives::
+* Location Directives::
+* Time Directives::
+
+
+File: find.info, Node: Name Directives, Next: Ownership Directives, Up: Format Directives
+
+Name Directives
+...............
+
+`%p'
+ File's name.
+
+`%f'
+ File's name with any leading directories removed (only the last
+ element).
+
+`%h'
+ Leading directories of file's name (all but the last element and
+ the slash before it).
+
+`%P'
+ File's name with the name of the command line argument under which
+ it was found removed from the beginning.
+
+`%H'
+ Command line argument under which file was found.
+
+
+File: find.info, Node: Ownership Directives, Next: Size Directives, Prev: Name Directives, Up: Format Directives
+
+Ownership Directives
+....................
+
+`%g'
+ File's group name, or numeric group ID if the group has no name.
+
+`%G'
+ File's numeric group ID.
+
+`%u'
+ File's user name, or numeric user ID if the user has no name.
+
+`%U'
+ File's numeric user ID.
+
+`%m'
+ File's permissions (in octal).
+
+
+File: find.info, Node: Size Directives, Next: Location Directives, Prev: Ownership Directives, Up: Format Directives
+
+Size Directives
+...............
+
+`%k'
+ File's size in 1K blocks (rounded up).
+
+`%b'
+ File's size in 512-byte blocks (rounded up).
+
+`%s'
+ File's size in bytes.
+
+
+File: find.info, Node: Location Directives, Next: Time Directives, Prev: Size Directives, Up: Format Directives
+
+Location Directives
+...................
+
+`%d'
+ File's depth in the directory tree; files named on the command line
+ have a depth of 0.
+
+`%F'
+ Type of the filesystem the file is on; this value can be used for
+ `-fstype' (*note Directories::.).
+
+`%l'
+ Object of symbolic link (empty string if file is not a symbolic
+ link).
+
+`%i'
+ File's inode number (in decimal).
+
+`%n'
+ Number of hard links to file.
+
+
+File: find.info, Node: Time Directives, Prev: Location Directives, Up: Format Directives
+
+Time Directives
+...............
+
+ Some of these directives use the C `ctime' function. Its output
+depends on the current locale, but it typically looks like
+
+ Wed Nov 2 00:42:36 1994
+
+`%a'
+ File's last access time in the format returned by the C `ctime'
+ function.
+
+`%AK'
+ File's last access time in the format specified by K (*note Time
+ Formats::.).
+
+`%c'
+ File's last status change time in the format returned by the C
+ `ctime' function.
+
+`%CK'
+ File's last status change time in the format specified by K (*note
+ Time Formats::.).
+
+`%t'
+ File's last modification time in the format returned by the C
+ `ctime' function.
+
+`%TK'
+ File's last modification time in the format specified by K (*note
+ Time Formats::.).
+
+
+File: find.info, Node: Time Formats, Prev: Format Directives, Up: Print File Information
+
+Time Formats
+------------
+
+ Below are the formats for the directives `%A', `%C', and `%T', which
+print the file's timestamps. Some of these formats might not be
+available on all systems, due to differences in the C `strftime'
+function between systems.
+
+* Menu:
+
+* Time Components::
+* Date Components::
+* Combined Time Formats::
+
+
+File: find.info, Node: Time Components, Next: Date Components, Up: Time Formats
+
+Time Components
+...............
+
+ The following format directives print single components of the time.
+
+`H'
+ hour (00..23)
+
+`I'
+ hour (01..12)
+
+`k'
+ hour ( 0..23)
+
+`l'
+ hour ( 1..12)
+
+`p'
+ locale's AM or PM
+
+`Z'
+ time zone (e.g., EDT), or nothing if no time zone is determinable
+
+`M'
+ minute (00..59)
+
+`S'
+ second (00..61)
+
+`@'
+ seconds since Jan. 1, 1970, 00:00 GMT.
+
+
+File: find.info, Node: Date Components, Next: Combined Time Formats, Prev: Time Components, Up: Time Formats
+
+Date Components
+...............
+
+ The following format directives print single components of the date.
+
+`a'
+ locale's abbreviated weekday name (Sun..Sat)
+
+`A'
+ locale's full weekday name, variable length (Sunday..Saturday)
+
+`b'
+`h'
+ locale's abbreviated month name (Jan..Dec)
+
+`B'
+ locale's full month name, variable length (January..December)
+
+`m'
+ month (01..12)
+
+`d'
+ day of month (01..31)
+
+`w'
+ day of week (0..6)
+
+`j'
+ day of year (001..366)
+
+`U'
+ week number of year with Sunday as first day of week (00..53)
+
+`W'
+ week number of year with Monday as first day of week (00..53)
+
+`Y'
+ year (1970...)
+
+`y'
+ last two digits of year (00..99)
+
+
+File: find.info, Node: Combined Time Formats, Prev: Date Components, Up: Time Formats
+
+Combined Time Formats
+.....................
+
+ The following format directives print combinations of time and date
+components.
+
+`r'
+ time, 12-hour (hh:mm:ss [AP]M)
+
+`T'
+ time, 24-hour (hh:mm:ss)
+
+`X'
+ locale's time representation (H:M:S)
+
+`c'
+ locale's date and time (Sat Nov 04 12:02:33 EST 1989)
+
+`D'
+ date (mm/dd/yy)
+
+`x'
+ locale's date representation (mm/dd/yy)
+
+
+File: find.info, Node: Run Commands, Next: Adding Tests, Prev: Print File Information, Up: Actions
+
+Run Commands
+============
+
+ You can use the list of file names created by `find' or `locate' as
+arguments to other commands. In this way you can perform arbitrary
+actions on the files.
+
+* Menu:
+
+* Single File::
+* Multiple Files::
+* Querying::
+
+
+File: find.info, Node: Single File, Next: Multiple Files, Up: Run Commands
+
+Single File
+-----------
+
+ Here is how to run a command on one file at a time.
+
+ - Action: -exec COMMAND ;
+ Execute COMMAND; true if 0 status is returned. `find' takes all
+ arguments after `-exec' to be part of the command until an
+ argument consisting of `;' is reached. It replaces the string
+ `{}' by the current file name being processed everywhere it occurs
+ in the command. Both of these constructions need to be escaped
+ (with a `\') or quoted to protect them from expansion by the shell.
+ The command is executed in the directory in which `find' was run.
+
+ For example, to compare each C header file in the current
+ directory with the file `/tmp/master':
+
+ find . -name '*.h' -exec diff -u '{}' /tmp/master ';'
+
+
+File: find.info, Node: Multiple Files, Next: Querying, Prev: Single File, Up: Run Commands
+
+Multiple Files
+--------------
+
+ Sometimes you need to process files alone. But when you don't, it
+is faster to run a command on as many files as possible at a time,
+rather than once per file. Doing this saves on the time it takes to
+start up the command each time.
+
+ To run a command on more than one file at once, use the `xargs'
+command, which is invoked like this:
+
+ xargs [OPTION...] [COMMAND [INITIAL-ARGUMENTS]]
+
+ `xargs' reads arguments from the standard input, delimited by blanks
+(which can be protected with double or single quotes or a backslash) or
+newlines. It executes the COMMAND (default is `/bin/echo') one or more
+times with any INITIAL-ARGUMENTS followed by arguments read from
+standard input. Blank lines on the standard input are ignored.
+
+ Instead of blank-delimited names, it is safer to use `find -print0'
+or `find -fprint0' and process the output by giving the `-0' or
+`--null' option to GNU `xargs', GNU `tar', GNU `cpio', or `perl'.
+
+ You can use shell command substitution (backquotes) to process a
+list of arguments, like this:
+
+ grep -l sprintf `find $HOME -name '*.c' -print`
+
+ However, that method produces an error if the length of the `.c'
+file names exceeds the operating system's command-line length limit.
+`xargs' avoids that problem by running the command as many times as
+necessary without exceeding the limit:
+
+ find $HOME -name '*.c' -print | grep -l sprintf
+
+ However, if the command needs to have its standard input be a
+terminal (`less', for example), you have to use the shell command
+substitution method.
+
+* Menu:
+
+* Unsafe File Name Handling::
+* Safe File Name Handling::
+* Limiting Command Size::
+* Interspersing File Names::
+
+
+File: find.info, Node: Unsafe File Name Handling, Next: Safe File Name Handling, Up: Multiple Files
+
+Unsafe File Name Handling
+.........................
+
+ Because file names can contain quotes, backslashes, blank characters,
+and even newlines, it is not safe to process them using `xargs' in its
+default mode of operation. But since most files' names do not contain
+blanks, this problem occurs only infrequently. If you are only
+searching through files that you know have safe names, then you need not
+be concerned about it.
+
+ In many applications, if `xargs' botches processing a file because
+its name contains special characters, some data might be lost. The
+importance of this problem depends on the importance of the data and
+whether anyone notices the loss soon enough to correct it. However,
+here is an extreme example of the problems that using blank-delimited
+names can cause. If the following command is run daily from `cron',
+then any user can remove any file on the system:
+
+ find / -name '#*' -atime +7 -print | xargs rm
+
+ For example, you could do something like this:
+
+ eg$ echo > '#
+ vmunix'
+
+and then `cron' would delete `/vmunix', if it ran `xargs' with `/' as
+its current directory.
+
+ To delete other files, for example `/u/joeuser/.plan', you could do
+this:
+
+ eg$ mkdir '#
+ '
+ eg$ cd '#
+ '
+ eg$ mkdir u u/joeuser u/joeuser/.plan'
+ '
+ eg$ echo > u/joeuser/.plan'
+ /#foo'
+ eg$ cd ..
+ eg$ find . -name '#*' -print | xargs echo
+ ./# ./# /u/joeuser/.plan /#foo
+
+
+File: find.info, Node: Safe File Name Handling, Next: Limiting Command Size, Prev: Unsafe File Name Handling, Up: Multiple Files
+
+Safe File Name Handling
+.......................
+
+ Here is how to make `find' output file names so that they can be
+used by other programs without being mangled or misinterpreted. You can
+process file names generated this way by giving the `-0' or `--null'
+option to GNU `xargs', GNU `tar', GNU `cpio', or `perl'.
+
+ - Action: -print0
+ True; print the full file name on the standard output, followed by
+ a null character.
+
+ - Action: -fprint0 FILE
+ True; like `-print0' but write to FILE like `-fprint' (*note Print
+ File Name::.).
+
+
+File: find.info, Node: Limiting Command Size, Next: Interspersing File Names, Prev: Safe File Name Handling, Up: Multiple Files
+
+Limiting Command Size
+.....................
+
+ `xargs' gives you control over how many arguments it passes to the
+command each time it executes it. By default, it uses up to `ARG_MAX'
+- 2k, or 20k, whichever is smaller, characters per command. It uses as
+many lines and arguments as fit within that limit. The following
+options modify those values.
+
+`--no-run-if-empty'
+`-r'
+ If the standard input does not contain any nonblanks, do not run
+ the command. By default, the command is run once even if there is
+ no input.
+
+`--max-lines[=MAX-LINES]'
+`-l[MAX-LINES]'
+ Use at most MAX-LINES nonblank input lines per command line;
+ MAX-LINES defaults to 1 if omitted. Trailing blanks cause an
+ input line to be logically continued on the next input line, for
+ the purpose of counting the lines. Implies `-x'.
+
+`--max-args=MAX-ARGS'
+`-n MAX-ARGS'
+ Use at most MAX-ARGS arguments per command line. Fewer than
+ MAX-ARGS arguments will be used if the size (see the `-s' option)
+ is exceeded, unless the `-x' option is given, in which case
+ `xargs' will exit.
+
+`--max-chars=MAX-CHARS'
+`-s MAX-CHARS'
+ Use at most MAX-CHARS characters per command line, including the
+ command and initial arguments and the terminating nulls at the
+ ends of the argument strings.
+
+`--max-procs=MAX-PROCS'
+`-P MAX-PROCS'
+ Run up to MAX-PROCS processes at a time; the default is 1. If
+ MAX-PROCS is 0, `xargs' will run as many processes as possible at
+ a time. Use the `-n', `-s', or `-l' option with `-P'; otherwise
+ chances are that the command will be run only once.
+
+
+File: find.info, Node: Interspersing File Names, Prev: Limiting Command Size, Up: Multiple Files
+
+Interspersing File Names
+........................
+
+ `xargs' can insert the name of the file it is processing between
+arguments you give for the command. Unless you also give options to
+limit the command size (*note Limiting Command Size::.), this mode of
+operation is equivalent to `find -exec' (*note Single File::.).
+
+`--replace[=REPLACE-STR]'
+`-i[REPLACE-STR]'
+ Replace occurences of REPLACE-STR in the initial arguments with
+ names read from standard input. Also, unquoted blanks do not
+ terminate arguments. If REPLACE-STR is omitted, it defaults to
+ `{}' (like for `find -exec'). Implies `-x' and `-l 1'. As an
+ example, to sort each file the `bills' directory, leaving the
+ output in that file name with `.sorted' appended, you could do:
+
+ find bills -type f | xargs -iXX sort -o XX.sorted XX
+
+ The equivalent command using `find -exec' is:
+
+ find bills -type f -exec sort -o '{}.sorted' '{}' ';'
+
+
+File: find.info, Node: Querying, Prev: Multiple Files, Up: Run Commands
+
+Querying
+--------
+
+ To ask the user whether to execute a command on a single file, you
+can use the `find' primary `-ok' instead of `-exec':
+
+ - Action: -ok COMMAND ;
+ Like `-exec' (*note Single File::.), but ask the user first (on
+ the standard input); if the response does not start with `y' or
+ `Y', do not run the command, and return false.
+
+ When processing multiple files with a single command, to query the
+user you give `xargs' the following option. When using this option, you
+might find it useful to control the number of files processed per
+invocation of the command (*note Limiting Command Size::.).
+
+`--interactive'
+`-p'
+ Prompt the user about whether to run each command line and read a
+ line from the terminal. Only run the command line if the response
+ starts with `y' or `Y'. Implies `-t'.
+
+
+File: find.info, Node: Adding Tests, Prev: Run Commands, Up: Actions
+
+Adding Tests
+============
+
+ You can test for file attributes that none of the `find' builtin
+tests check. To do this, use `xargs' to run a program that filters a
+list of files printed by `find'. If possible, use `find' builtin tests
+to pare down the list, so the program run by `xargs' has less work to
+do. The tests builtin to `find' will likely run faster than tests that
+other programs perform.
+
+ For example, here is a way to print the names of all of the
+unstripped binaries in the `/usr/local' directory tree. Builtin tests
+avoid running `file' on files that are not regular files or are not
+executable.
+
+ find /usr/local -type f -perm +a=x | xargs file |
+ grep 'not stripped' | cut -d: -f1
+
+The `cut' program removes everything after the file name from the
+output of `file'.
+
+ If you want to place a special test somewhere in the middle of a
+`find' expression, you can use `-exec' to run a program that performs
+the test. Because `-exec' evaluates to the exit status of the executed
+program, you can write a program (which can be a shell script) that
+tests for a special attribute and make it exit with a true (zero) or
+false (non-zero) status. It is a good idea to place such a special
+test *after* the builtin tests, because it starts a new process which
+could be avoided if a builtin test evaluates to false. Use this method
+only when `xargs' is not flexible enough, because starting one or more
+new processes to test each file is slower than using `xargs' to start
+one process that tests many files.
+
+ Here is a shell script called `unstripped' that checks whether its
+argument is an unstripped binary file:
+
+ #!/bin/sh
+ file $1 | grep 'not stripped' > /dev/null
+
+ This script relies on the fact that the shell exits with the status
+of the last program it executed, in this case `grep'. `grep' exits
+with a true status if it found any matches, false if not. Here is an
+example of using the script (assuming it is in your search path). It
+lists the stripped executables in the file `sbins' and the unstripped
+ones in `ubins'.
+
+ find /usr/local -type f -perm +a=x \
+ \( -exec unstripped '{}' \; -fprint ubins -o -fprint sbins \)
+
+
+File: find.info, Node: Common Tasks, Next: Databases, Prev: Actions, Up: Top
+
+Common Tasks
+************
+
+ The sections that follow contain some extended examples that both
+give a good idea of the power of these programs, and show you how to
+solve common real-world problems.
+
+* Menu:
+
+* Viewing And Editing::
+* Archiving::
+* Cleaning Up::
+* Strange File Names::
+* Fixing Permissions::
+* Classifying Files::
+