A Linux system has a hierarchical file system which starts at the root. File systems in Linux distributions can be a bit complicated for a user, especially a beginner if he is trying to find files.
In this tutorial, we learn how to use locate command to find your files.
Locate command in Linux is a command line tool used to list/find files by name or some patterns provided by the user. It is super easy to use the locate command and its output entries super fast than any other tool because it searches the files from a database of files.
The standard syntax to be followed is:
locate [options] [pattern]
Linux locate vs find
There are many tools present in Linux for locating files in the system. Like, find, which, locate, etc which works differently and outputs the data in independent ways. Out of which find and locate are mostly used.
By using the find command you can search for files by owner, name, group, permissions, type, size, time modified, date and various other patterns as well. But the find searches the filesystem recursively which consumes a lot of time and therefore makes it inefficient.
On the other hand, locate command searches for your files from an existing database of files rather than going through the whole filesystem which makes it fast as well as efficient.
Install Linux locate
Locate command comes preinstalled with some Linux Distributions. If you getting locate command not found error, install using the package manager.
For Ubuntu / Debian-based operating systems:
sudo apt install mlocate
For CentOS Stream/Redhat OS:
sudo yum install mlocate
For Fedora Linux:
sudo dnf install mlocate
And for Arch Linux-based operating systems:
sudo pacman -S mlocate
How locate command works
As discussed earlier, locate command uses a database file to search for files in the system. This file should be updated in order to output only the latest entries of files. Therefore a cron job is created for running the command "sudo updatedb" after every 24 hours. This updates the database file with the latest files created.
Files created after this update will not be displayed in the output screen if you searched for that specific files. Therefore it's better to update the database manually with the following command -
This will take some time depending on how much your system is loaded with files. This doesn't really give any output and just updates the database files -
How to use locate command in Linux
Let us see some useful examples of locate command with its parameters and patterns.
Example 1: Locate a file
To locate the files with the pattern "mysql" we will just run the following command:
And it will display all the files with full paths in the format of a list.
Example 2: Limit the search query
As the output entries are too many you can limit entries with the help of the -n parameter like this:
locate *.txt -n 10
It displays all the txt files with any names but as the limit is set to 10, only that amount of entries will be displayed.
Example 3: Display number of matching entries
Display the number of files that exist with the matching pattern with the -c option.
locate -c apache2
As the image shows, eg: 735 file names exist with the pattern "apache2", 35 of "mysql", etc.
Example 4: Ignore case when matching patterns
By default locate command searches with case-sensitive files. To override this the -i option can be used to ignore the case of the patterns -
locate -i "sample."
As in the output entries, there are all the files with small and capital alphabets present.
Example 5: Format the Output
The output of locate command line can be a very long list and its better to format the output with -
locate mysql | less
Which makes scrolling a lot easier and clean as we know the start and end of all the entries on the terminal screen.
Example 6: Replace the default database
By default, the mlocate database is located at /var/lib/plocate/plocate.db. But you can use your own database.
locate -d /path/to/your/database.db <file_name>
For eg: You have created a backup of the database before the updatedb command. Then you can search queries in the old backup database.
Example 7: Search for a File with an Exact Name
You can only search for files that contain the search term using a simple syntax. Use the -r option and add the dollar sign ($) to the end of your search term to get the file with the exact name, for instance:
locate -r mysql$
Example 8: Output without New Line
The output by default will be in the form of a list. But you can put a NULL instead of a newline to separate matches.
locate -i -0 *sample.py*
Example 9: Show Existing Files
If you haven't updated the database, the Linux locate command may even display a deleted file, as we've already mentioned. Thankfully, you can avoid this issue by using the -e option, as shown here:
locate -e sample.py
locate command options
Find useful options of locate command.
|-0||For the separator instead of using a new line, use ASCII NULL.|
|-A||Instead of names matching one or more non-option arguments, only names matching all non-option arguments will be printed.|
|-b||If the pattern matches the last part of the name of a file listed in the database, the results are deemed to match. The 'base name' is the term used to describe this last element.|
|-c||If print (-p) is also present, print the total number of matches we found rather than the names of the matched files.|
|-d path||Search the file name databases in the path, which is a separate list of database file names, as opposed to the default file name.|
|-e||Only print names that are in use right now.|
|-E||Print only those names that are currently unavailable.|
|--help||Print a list of the ways to find and leave.|
|-i||Case distinctions in the names and the pattern should be ignored.|
|-l N||Only allow N matches in total.|
|-L||Broken symbolic links should be treated as non-existent when checking for the existence of files. This is the standard.|
|--max-database-age D||By default, locate searches a database that is more than 8 days old and a warning message will be displayed. This option alters that value from 8 to a different number.|
|-m||Accepted but does nothing, it is for BSD locate compatibility.|
|-P, -H||Treat broken symbolic links as if they were real files when testing for file existence (using the -e or -E options). The -H version of this option is only included for find compatibility; -P is preferred over -H.|
|-p||Because of the presence of --statistics (-S) or --count, print search results when they normally wouldn't|
|-r||Filenames that match the given regular expression in their full paths are displayed.|
|--regextype R||R dialect for regular expressions There are a number of dialects that are supported, including "findutils-default," "posix-awk," "posix-basic," "posix-egrep," "posix-extended," "posix-minimal-basic," "awk," "ed," "egrep," "emacs," "gnu-awk," "grep," and "sed."|
|-s||Accepted but does nothing for BSD locate compatibility.|
|-S||Unless non-option arguments are provided, print various statistics about each locate database and then exit without conducting a search. For BSD compatibility, -S is accepted as an alternative to --statistics.|
|--version||Print the locate and exit version number.|
|-w||Compare against the entire file name that is listed in the database. This is the standard.|
Linux locate command is very useful to find files existing files in your system. Especially in Linux servers where you have to communicate with a terminal. Locate command is fast and efficient with only one disadvantage i.e. you will need to update the database from time to time. Locate command offers many options for users to filter out file search queries according to their needs.
Try out more options by going through the manual with man command.
Navigate all-in-one place of Linux Commands for more learning.