How to Search for Files on Linux using find
and locate
Commands
When working with Linux, one common challenge is finding specific files. In this guide, we will explore how to use the find
command to search for files based on various filters and parameters. We will also briefly cover the locate
command, which provides an alternative way to search for files. Let’s dive into how to search for files on Linux.
Prerequisites
In order to proceed with this tutorial, you must have a computer that runs on a Linux-based operating system. This can be either a local machine or a virtual private server accessible through SSH. While the demonstrations in this guide were verified on Ubuntu 20.04, they should function on any Linux distribution.
Searching by File Name
The most commonly used method to search for files is by their name. To locate a file by name using the find
command, you can utilize the following syntax:
$ find / -name "query"
By default, this search is case-sensitive. If you want to perform a case-insensitive search, you can employ the -iname
option:
$ find / -iname "query"
If you wish to find all files that do not match a particular pattern, you can utilize the -not
option:
$ find / -not -name "query_to_avoid"
Alternatively, you can use the exclamation point (!
) to invert the search:
$ find / ! -name "query_to_avoid"
When employing the exclamation point, remember to escape it with a backslash () to prevent the shell from interpreting it.
Searching by File Type
Another way to search for files is based on their type using the -type
parameter. Here are some type descriptors you can utilize:
f
: Regular filed
: Directoryl
: Symbolic linkc
: Character deviceb
: Block devicep
: Named pipe (FIFO)s
: Socket
For instance, if you want to find all character devices on your system, execute the following command:
$ find /dev -type c
To search for files with a specific extension (e.g., .conf
), employ the -name
option along with the *.extension
pattern:
$ find /usr -type f -name "*.conf"
You can combine multiple search expressions using the -and
operator (implied when no option is specified) or the -or
operator:
$ find -name query_1 -or -name query_2
Filtering by Size and Time
The find
command offers various options to filter files based on their size and time.
Size
To filter files by size, utilize the -size
parameter followed by a size value and a suffix indicating the unit. Common size suffixes include:
c
: Bytesk
: KilobytesM
: MegabytesG
: Gigabytes
For instance, to locate files that are exactly 50 bytes in size:
$ find /usr -size 50c
To find files that are smaller than 50 bytes:
$ find /usr -size -50c
Time
To filter files based on their modification time, you can employ the -mtime
, -atime
, and -ctime
parameters.
-mtime
: Modification time (time when the file content was last changed).-atime
: Access time (time when the file was last accessed).-ctime
: Change time (time when the file metadata, such as permissions, was last changed).
You can specify the time using different formats:
n
: Exactly n days ago.-n
: Less than n days ago.+n
: More than n days ago.
For example, to find files modified within the last 7 days:
$ find /usr -mtime -7
To locate files accessed more than 30 days ago:
$ find /usr -atime +30
To discover files whose metadata (such as permissions) has changed within the last 24 hours:
$ find /usr -ctime 0
Finding by Owner and Permissions
The find
command also allows you to search for files on Linux based on their owner and permissions.
Owner
To find files owned by a specific user, you can use the -user
parameter followed by the username. For example, to search for files owned by the user “john”:
$ find / -user john
Permissions
You can search for files based on their permissions using the -perm
parameter. This parameter accepts a numeric mode or symbolic notation representing the desired permissions.
To find files with specific permissions expressed in numeric mode, use a three-digit octal number. For example, to search for files with read, write, and execute permissions for the owner, and read permissions for others:
$ find / -perm 744
To search for files with specific permissions expressed in symbolic notation, use a combination of u
(user), g
(group), o
(others), r
(read), w
(write), and x
(execute). For example, to search for files with read and write permissions for the owner:
$ find / -perm u=rw
You can also combine multiple permissions and specify different ownership levels in symbolic notation. For example, to search for files with read and execute permissions for the owner, write permission for the group, and read permission for others:
$ find / -perm u=rx,g=w,o=r
By utilizing the -user
and -perm
options, you can effectively search for files on Linux based on their owner and permissions.
Executing Commands on find
Results
The find
command not only helps you locate files but also enables you to perform actions on the search results. You can execute various commands on the files found by find
using the -exec
option.
The basic syntax for executing commands on find
results is as follows:
$ find /path/to/search -name "query" -exec command {} ;
In this syntax:
/path/to/search
is the directory where you want to search for files."query"
is the search pattern to match file names.-exec command {} ;
is the option to execute a command on the found files.command
is the command you want to execute.{}
is a placeholder that will be replaced by the name of each found file.;
is used to terminate the-exec
option.
For example, to delete all files with the .log
extension in the /var/log
directory, you can use the following command:
$ find /var/log -name "*.log" -exec rm {} ;
This command will execute the rm
command on each file found by find
, deleting all files with the .log
extension.
You can also combine multiple commands or pass additional arguments to the command. Just ensure to properly escape any special characters.
Using the -exec
option with the find
command provides flexibility in performing actions on the search results, making it a powerful tool for file management and automation.
Using locate
Command
The locate
command provides a faster way to search for files on your system by utilizing a prebuilt database called the locate database. The database is updated regularly, so it may not include recently created or modified files. It’s another effective way to search for files on Linux.
Database Initialization:
Before using the locate
command, it’s crucial to ensure that the database is up to date. Execute the following command as root or with sudo
:
$ sudo updatedb
This command updates the database used by locate
to index the file system.
Searching for Files:
To search for files using locate
, simply specify the keyword or pattern you want to search for. For example:
$ locate file.txt
This command will find all files with “file.txt” in their name.
Case Sensitivity:
By default, the locate
command is case-insensitive. If you want to perform a case-sensitive search, use the -i
option. For example:
$ locate -i File.txt
This command will find files with “File.txt” or “file.txt” in their name.
Updating the Database:
The file database used by locate
may not always be up to date. To ensure you have the latest file information, periodically update the database using the updatedb
command.
Alternative Solutions to Searching for Files on Linux
While find
and locate
are powerful tools, here are two alternative approaches to searching for files in Linux, offering different trade-offs in terms of speed, flexibility, and dependencies:
1. Using fd-find
(A Simpler and Faster Alternative to find
)
fd-find
(often shortened to fd
) is a modern alternative to find
. It’s designed to be faster, more user-friendly, and have more sensible defaults. It’s typically installed via a package manager (e.g., apt install fd-find
on Debian/Ubuntu, brew install fd
on macOS).
-
Explanation:
fd
is written in Rust and boasts significant performance improvements overfind
, especially for large directory trees. It also ignores hidden directories and.gitignore
files by default, making it more convenient for searching within source code repositories. The syntax is also simpler and more intuitive. -
Code Example: To find all
.txt
files in the current directory (and its subdirectories), ignoring hidden directories and.gitignore
files:fd -e txt
To find all files named "my_file.txt" (case-insensitive):
fd -i my_file.txt
To execute a command on each found file (similar to
find -exec
):fd -e txt -x rm
This would delete all
.txt
files.
2. Using ripgrep
(For Searching File Content as well as Filenames)
While ripgrep
is primarily a tool for searching the contents of files, it can also be used effectively to search for files based on patterns in their names or paths. Like fd
, it’s typically installed via a package manager.
-
Explanation:
ripgrep
is exceptionally fast because it uses regular expressions and parallel processing. It also respects.gitignore
files by default. While it’s not specifically designed for finding files only, its speed and features make it a viable option when you also need to search file content. -
Code Example: To find all files containing the string "important_data" in their content:
rg "important_data"
To find all files whose names contain "config" (case-insensitive) and print their content (you won’t just get the filenames; you’ll get the matching lines within the files):
rg -i "config"
To list only the filenames that contain "config" (case-insensitive):
rg -i -l "config"
The
-l
(lowercase L) option tellsripgrep
to only print the names of the files that match the pattern.To search for files only within a specific directory:
rg -i -l "config" /path/to/directory
These alternative solutions offer different strengths. fd
is generally a faster and simpler replacement for find
for most common file-finding tasks. ripgrep
, while primarily a content search tool, can also be used effectively to find files when combined with the -l
option, especially when you also want to search file contents.
Conclusion
Searching for files on Linux can be accomplished using the find
and locate
commands. The find
command provides more flexibility and allows for fine-grained searches based on various criteria, such as file name, type, size, and time. On the other hand, the locate
command provides a faster search using a prebuilt database. fd
and ripgrep
offer modern and often faster alternatives for common file searching tasks.
By mastering these commands, you can efficiently search for files on Linux and streamline your workflow.