PROGRAMS

find

Article by:
Date Published:
Last Modified:

Overview

find is a UNIX utility program which searches directory trees for files matching particular patterns.

By default, find is recursive. It searches from the specified directory and looks in all sub-directories.

By default, the search pattern uses glob-style pattern matching (not regex). However, regex can be supplied with the -regex option (more )

Find File By Name

A common use case is using find to find files which match a specific glob pattern. For example, if you wanted to find all C++ header files (.hpp) in the current directory and all subdirectories (remember, find is recursive by default), you would use:

1
$ find . -name '*.cpp'

You have to provide the * at the start because find matches against the whole path (it doesn’t allow partial matches).

WARNING

Always make sure to make the search path the first argument to find, as find is sensitive to the argument order (even with optional arguments!).

Multiple Patterns

You can provide find with multiple patterns by using the -o option.

The following example looks for all files with the .cpp or .hpp file extension in the current directory.

1
$ find . -name "*.cpp" -o -name "*.hpp"

Find In Path

The -name option only searches in the filename, but not the path in which the file sits. If you want to find matches against the path, use the -path option instead. The following example will find all paths that contain the string image:

1
$ find . -path '*image*'

Note that the path includes the filename, so you’ll find matches in the file name also. Replace -path with -ipath to make the pattern case insensitive.

As far as I know, the -wholename option is identical to -path. I believe -path is more portable, being part of the POSIX 2008 standard.

Using Regex

You can use the -regex flag to use regex search patterns instead of glob. For example, to find all images in your current directory that have a filename made of numbers, you could use:

1
$ find . -regex '\./[0-9]+\.jpg'

Note that find always lists files in the current directory with ./ at the start.

By default, find uses emacs style regex, which have different escaping rules than the usual egrep regex. Weirdly, on Mac I could not get the + operator (match one or more of the proceeding item) to work. I had to add -E (the -E tells find to use extended regex):

1
$ find . -regex '\./[0-9]+\.jpg' -E

Finding Directories

You can restrict find to searching just for directories by providing the -type d argument:

1
$ find . -type d -name "my_dir_name"

Combining With sed

find, a program which finds files, lends itself to working well in conjunction with sed, a program for modifying the contents of a file.


Authors

Geoffrey Hunter

Dude making stuff.

Creative Commons License
This work is licensed under a Creative Commons Attribution 4.0 International License .

Related Content:

Tags

comments powered by Disqus