On Raspberry Pi OS (especially the lite version), there is no fancy tool to find a file on your SD card. And yet, that would be pretty useful!
No worry, you can do everything with a few commands to learn. I will show you everything in this tutorial.
How do I find a file on Raspberry Pi?
Find, locate and grep are three commands very useful to search for a file on Raspberry Pi.
They accept interesting options, to quickly locate any file on the Raspberry Pi file system.
In this post, I’ll explain the command syntax for each one, and give you a few examples, so you can use them correctly.
I will also give you a bonus tip at the end 🙂
Before going further, if you are really new in the command line, I recommend checking my tutorial on how the Raspberry Pi file system works.
All the commands listed here can be use on most Linux operating systems. Just connect to your Raspberry Pi with SSH, open a session if on a minimal system, or start a terminal on Desktop.
Find is the command that most people will give you when you ask where is my file.
It’s powerful and will save you most of the time, as you can add many criteria to filter the results you are interested in.
Unfortunately, many criteria means many options to remember when you try to use it.
I will try to keep this simple, and give you the most useful options only.
The find syntax is generally formatted as:
find [path] [options]
You can remove the path to search in the current directory (recursively), or the options (to display all file), but most of the time you will use both.
Also, when looking for a file in the whole file system, don’t forget to use sudo to get access to the system files.
Here is a simple example to clarify:
sudo find /var -name syslog
And the result is:
This is perfect if you know the exact name of a file and want to locate it, but it’s not working if you only have a part of the name.
If you also want files containing the word you provide in parameter, you can use stars as wildcard, for example:
sudo find /var -name *syslog
sudo find /var -name syslog*
sudo find /var -name *syslog*
The first one is for file ending with “syslog”, the second starting with “syslog” and the last one containing “syslog”.
And a last alternative for a basic search, is to use the “-iname” option rather than “-name”.
It will display the results, for insensitive case match.
If a file is name “SYSlog” somewhere, it will find it with iname, not with name.
Ok, so the name/iname option is cool, but what if I don’t know the name of the files I’m looking for?
Well, find has many options to help you in this case.
The first one is to find files depending on their creation, access or modification date.
It works all the same, so I’ll give you all the options at once:
- -cmin: Difference in minutes from the creation date
- -ctime: Difference in days from the creation date
- -mmin: Same thing for the modification minutes
- -mtime: And modification days
- -amin: This one is for access time elapsed in minutes
- -atime: Or days
For each of this option, you can specify a threshold, and say if it should be above or that threshold.
A few examples will be clearer 🙂
- Find files in /home/pi created less than 60 minutes ago:
find /home/pi -cmin -60
- Look for files in /var/log that have not been modified in the last 3 days:
sudo find /var/log -mtime +3
It’s very useful when you want to clean your system, or find a file you recently created or modified but don’t remember where.
The last option is to look for specific file sizes. It’s also useful when you want to free disk space on your SD card.
It works almost the same as the previous one, so I’ll directly give you two examples:
- Find files bigger than 100MB on your system:
sudo find / -size +100M
- Or smaller than 100M:
sudo find / -size -100M
- Or even empty files:
sudo find / -size 0
Excellent command to find the biggest files on a system or share, and remove them 🙂
As I told you at the beginning, the idea here is not to master the find command, as there is so many things to say.
But with these options you can already find files in most cases.
I will add two tips to these before switching to the next tool.
- You can combine several options in the files command. For example:
sudo find /var/log -size +100M -mtime +30
Will list all log files over 100M and not modified in the last month.
- You can look at the manual page if you are interested in other options:
For example, you can execute a command on the results, display files only, disable recursive mode, etc.
Let’s check the “locate” command now.
Locate is a command that is easier to use for beginners.
I remember using it all the time at my beginning on Linux, as I never reminded the find command options.
The difference with find, is that locate will create a temporary database regularly, to find files quickly (instead of looking for all files with each new request).
Now, on recent system versions, it’s not longer included in the system, so you have to start by installing it.
Here is the command to install it on Raspberry Pi OS:
sudo apt install mlocate
The first thing to do after the installation is to create the database.
Here is the command:
I think that this command is automatically done daily on your system, but you can schedule a task if you want to program it as you want.
Once done, you can now use locate directly.
The main goal with locate is to quickly find a file based on its name.
There are a few options, but it’s really simpler than find.
So, the syntax is always something like:
locate [OPTION] [SEARCH]
You never need sudo with this command, as the database is already created and updated with it.
Here are three examples of what you can do:
- Find all file name containing your search pattern:
There is no wildcard here, so this command:
locate syslogwill find any file name containing the word “syslog”
- Ignore case in your search:
locate -i SysLog
- Only filenames containing the string, exclude matches in path name:
locate -b syslog
That’s the main options you’ll use (and probably only the first one).
As you can see, locate is perfect when you know the file name and want a quick result, but not so useful in other cases.
Filter with grep
Locate is limited in options, but you can still filter the results with other Linux commands, for example: grep.
I’ll give more details about grep in the next part, but for the moment, just remember that grep is a command that you can use to search for an expression. So we can use it after locate to display only the lines we want.
The syntax will be:
locate [FILE] | grep [EXPRESSION]
locate syslog | grep /usr/bin
My “locate” command will give me too many results, but if I’m only interested in the binary file, I can filter the results that contains “/usr/bin”.
The last command you can use to search for files is grep.
I already give you the general idea, but it can do much more than that.
You already learn many ways to find a file since you’re reading this, but to be absolutely complete, there are a few things that are missing.
Grep is a powerful tool, to search strings in a text or in a file.
I already explained the basics of this command that you can combine with any other one to filter the results, but what is fascinating is to look inside files.
Use it to search in file content
Here is an example of why I use it so often.
Let’s say you have a folder with all your source code, maybe /home/pi/code.
You are looking for all files using a function you just changed (let’s say “send_email()”).
You can’t do this with find or locate, as they are just search in file names or attributes, not in the file content.
But grep can do this!
The syntax we’ll use is:
(sudo) grep [OPTIONS] [SEARCH] [PATH]
sudo can be added if you are looking in system folders.
Then there are many options you can add (check the man page), and finally the search string and path are similar to what we have seen previously.
Let’s take another example.
I want to update my Raspberry Pi OS version, but I don’t know where are the apt files to edit to change the repository name (from “buster” to the “bullseye” or whatever version name).
You can do a search on the whole system with:
sudo grep --color -nHr 'buster' *
So the files I’m looking for are in /etc/apt, and I have 4 files to edit to make this change.
Here are the options I used:
- –color: put file name and string matches in colors
- -n: display the line number for each match
- -H: display the file name for each match
- -r: use a recursive search
- ‘buster’: the string I’m looking for in any file
- *: I’m searching in any file under my current path (“/”)
As always, “man <command>” will give you every option you might need in your case.
I often use -v (list files that doesn’t match the search expression), and -A/-B/-C to display lines around the match.
That’s it, if you remember these 3 commands, you should be able to find any file on your Raspberry Pi.
In fact, there are common commands on any Linux system, so it may help you a lot in other situations. That’s really commands I’m using almost every day at work.
Also, I promise a bonus at the end, but I have three for you 🙂
- Another command that can be useful in some cases is “whereis”.
It will give you the location of a binary file.
whereis syslogWill only display the service location, not all the logs and documentations files.
- If you are on desktop, there are also graphical tools that you can use as a search engine.
For example, you can try Tracker or Recoll, both available in the default repository.
- And finally, remember that you can mix these 3 commands with most other Raspberry Pi commands. If you are interested in this, read my selection here of the most useful commands on Raspberry Pi (and get a free cheat sheet to remember them ^^)