02. Searching for Files with find find

The locate command is useful and efficient if you need to locates a file based on its pathname. However, if you want more flexibilty and power in your search, you can use the find command.

There are three main parts of the find command:

  1. Where to look
  2. Criteria
  3. Actions

Below is an example of a typical find command.

find command structure

Let's go through this piece-by-piece.

Where to look

The first argument is which directories we want to look in. By default, the shell searches recursively through the directory specified.

$ find . 
.
./file1.txt
./file2.txt

This simple example will list out all file names and directories in the current folder (.). You may place a relative or an absolute pathname here, or your home directory (~).

If you have a lot of files and want to see how many files are being listed, we can use the wc command.

$ find . | wc
3 3 32

This shows us that this particular find command returns 3 words, 3 lines and 32 characters. In other words, we have just three files (including folders) being outputted.

Criteria

Now, it's probably not manageable to list out all contents, or as useful to just wc results. Additionally, we wouldn't want to pipe our results as that can be too messy of a command.

Luckily we can use criteria to filter our results directly through the find command.

Specifying file type

A useful option we can use is type, which is used to filter based on the type of file.

To specify a directory or file, we simply pass a d, or f respectively.

$ find ~ -type d
# List all directories within our home 
$ find ~ -type f 
# List all files within our home

You can also use a l type for symbolic links.

Specifying file name

In addition to file type, we can specify name with the -name option. We can add wildcards for more flexibility and power.

$ find ~ -type f -name "*.html"
# All files in our home directory with a .html extension

For the case-insensitive option, we use -iname.

Specifying file size

To specify a file size, we use the -size option. Before typing out the size, place either a - or + symbol. This specifies if you want results that are smaller or larger than the given value.

k
Kilobytes.
M
Megabytes.
G
Gigabytes.
$ find ~ -type f -name "*.html" -size -3M
# Search for all files with an .html extension with a size < 3 megabytes. 

Many more!

There are plenty of other options that are available to suit your needs. Remember to check out the man page for a list of all of them. Here are some of our favorites that you may find useful.

-cmin n
files or directories that were modified n minutes ago.
-empty
files or directories that are empty.
-mtime n
Files or directories that were modified within n*24 hours ago.
-mmin n
Files or directories modified at least +n minutes ago and less than -n minutes ago.
-maxdepth n
Descend at most n levels into a directory.
-mindepth n
Descend at least n levels into a directory.
-mount
Don't traverse directories that are mounted on other file systems.
-newer file
Files and directories that are newer than file.
-perm mode
Find files/directories that match a specified mode.
-user name
Find files or directories belonging to a name.
Can also use the -uid or -guid to find by user ID and group ID.

Logical Operators

We can combine logical operators to further specify our search specifications; to specify precedence, surround the statements with \( and \).

-and
Both expressions are true.
-or
Either expression must be true.
-not
Negate.

For example, if we wanted our search criteria to match two criteria, we can link a statement with an -and. If we just want one of the criteria to be satisfied, use -or statement.

$ find . -type f \( -name "*.html" \) -or \( -name "*.php" \)
# Return all files with a .html extension and readable by others 
$ find . -type f \( -name "*.html" -and -perm -o=r \)

Actions

Lastly, we have our actions, where apply a command to the files that have been found.

-delete
Delete the currently matching file.
-ls
Perform ls -dils on matching files.
-print
Output the full pathname of match file.
-quit
Quit once a match is made.

Take your Linux skills to the next level!

Command Line Kung Fu

Take your Linux skills to the next level! Try Linux & UNIX

Command Line Kung Fu is packed with dozens of tips and practical real-world examples. You won't find theoretical examples in this book. The examples demonstrate how to solve actual problems. The tactics are easy to find, too. Each chapter covers a specific topic and groups related tips and examples together.

$ Check price
14.9914.99Amazon 4.5 logo(27+ reviews)

More Linux & UNIX resources

Aching back from coding all day?

Inversion Therapy Table

Aching back from coding all day? Try Back Problems

Stretch out your back and relieve your back muscles with inversion therapy. This device counteracts the forces of gravity on the body by decompressing and elongating the spine. By using this product just ten minutes a day, you can be well on your way to improved circulation and posture while relieving muscle aches, back pain and stress.

$$ Check price
119.98119.98Amazon 4.5 logo(1,700+ reviews)

More Back Problems resources

Ad