Unix Find Command Notes and Examples

August 7, 2007 – 7:59 pm

 Tip courtesy of Kyle Reynolds at http://www.camelrichard.org

find command notes and examples
——————————-

find <where-to-look> <criteria< <what-to-do>

There are several options for matching criteria:
-atime n        File was accessed n days ago
-mtime n        File was modified n days ago
-size n         File is n blocks big (a block is 512 bytes)
-type c         Specifies file type: f=plain text, d=directory
-fstype typ     Specifies file system type: 4.2 or nfs
-name nam       The filename is nam
-user usr       The file’s owner is usr
-group grp      The file’s group owner is grp
-perm p         The file’s access mode is p (where p is an integer)

You can use  +  (plus) and  -  (minus) modifiers with the atime, mtime, and size criteria to increase
                their usefulness, for example,

-mtime +7       Matches files modified more than seven days ago
-atime -2       Matches files accessed less than two days ago
-size +100      Matches files larger than 100 blocks (50KB)

By default, multiple options are joined by “and”. You may specify “or” with the  -o  flag and the use
of grouped parentheses. To match all files modified more than 7 days ago and accessed more than 30 days
ago, use:

  \( -mtime +7 -o -atime +30 \)

You may specify “not” with an exclamation point. To match all files ending in .txt except the file
notme.txt, use:

  \! -name notme.txt -name \*.txt

You can specify the following actions for the list of files that the find command locates:
-print  Display pathnames of matching files.
-exec cmd       Execute command cmd on a file.
-ok cmd         Prompt before executing the command cmd on a file.
-mount  (System V) Restrict to file system of starting directory.
-xdev   (BSD) Restrict to file system of starting directory.
-prune  (BSD) Don’t descend into subdirectories.

Executed commands must end with  \;  (a backslash and semi-colon) and may use  {}  (curly braces) as a
placeholder for each file that the find command locates. For example, for a long listing of each file
found, use:

  -exec ls -l {} \;

EXAMPLES
=================================================================================

Search for file with a specific name in a set of files (-name)

    find . -name filename.conf
    find /usr -name filename.conf

How to apply a unix command to a set of file (-exec).

    find . -name filename.conf -exec chmod 777 {} \;
 

How to search for a string in a selection of files (-exec grep …).

    find . -name \*.conf -exec grep ftpd {} \;
    find . -name “*.conf” -exec grep ftpd {} \;

                 ^ note that wildcard must be slashed out or quoted so the shell doesn’t expand it first.

Redirect error messages produced by find to /dev/null

    find / -name foo 2>/dev/null

find in directory list

    find htdocs cgi-bin -name “*.cgi” -type f -exec chmod 755 {} \;

To report all files starting in the directories /mydir1 and /mydir2 larger
than 2000 blocks (about 1000KB) and that have not been accessed in over 30 days, enter:

    find /mydir1 /mydir2 -size +2000 -atime +30

To remove (with prompting) all files starting in the /mydir directory that have
not been accessed in over 100 days, enter:

    find /mydir -atime +100 -ok rm {} \;

To show a long listing starting in /mydir of files not modified in over 20
days or not accessed in over 40 days, enter:

    find /mydir \(-mtime +20 -o -atime +40\) -exec ls -l {} \;

To list and remove all regular files named core starting in the directory
/prog that are larger than 500KB,
enter:

    find /prog -type f -size +1000 -print -name core -exec rm {} \;

Post a Comment