The Terminal in OS X is a relatively powerful environment, where you have access to a number of scriptable tools that can help you configure, gather information, and otherwise use your Mac in ways that you cannot otherwise do with a mouse and graphical elements. Granted some of these more advanced features of the terminal require extensive experience, but if you are just getting started, then you might wonder how you simply find files in the Terminal.
In the OS X GUI, you simply have to invoke a Finder search by pressing Command-F, or invoke Spotlight with Command-Space, and then use these services to search for files not only by name, but also by content.
In the Terminal, as with all tasks, finding files requires you know how to use a few basic commands. The three that will be most useful in OS X are the “find” command, the “mdfind” command, and the “locate” command. When run, these commands will search for a specific query and then output the full path to all resulting files that fall within the scope of your search.
find
This command is the straightforward option for finding files on Unix-based systems. To use it at its basics, you specify the location to start your search, and then options like file names and file types. When executed, it will walk the folder hierarchy from that specified point and output the full paths to the files that match your search criteria.
find /Users/tkessler/Desktop/ -name myfile.txt
The example above will start at the desktop of my account, and find any file named “myfile.txt.” In addition to the “-name” flag, you can use others such as “-size” to specify a file size, or “-type” to specify the file type (specifically a file, or a directory, or a link). The specifics of these options can be found in the manual page of the “find” command, and there are a number of additional options you can use to filter by details such as permissions settings, extended attributes, and even execute additional scripts on only the found items.
locate
The locate database is an effort to have an indexed search in Unix systems. While the “find” command is thorough, it will take a while to check each and every file in the system, which on some systems can take hours to complete. Therefore, if you need to search for system files you can enable the locate database with the following command (followed by supplying your password, and confirming your wish to activate the database):
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
This command can be used easily to find system configuration files, or where a specific command is located. For instance, the “lsregister” command is useful for updating the database that links file types to their handlers; however, this command is hidden deep in Apple’s framework files. If you remember that “lsregister” is the file name, then you can find its location quickly by running the following command:
locate lsregister
mdfind
This command is Apple’s find routine, which searches for files based on their contents and metadata as stored in the Spotlight index. In essence, this is the terminal interface for Spotlight searches, and may be the most practical searching option in the OS X Terminal.
To use this command, you simply run “mdfind” followed by your search query, such as the following:
mdfind mysearch
This search will find any file that has the text “mysearch” associated with it. This can be in the file’s contents, in its metadata, or in its file name; however, you can specify a file name only to search, by using the “-name” flag similar to the “find” command. You can also specify in which directory to search by using the “-onlyin” flag followed by the desired directory path:
mdfind mysearch -onlyin /Users/tkessler/Desktop/
As with the “find” command, you can look up specifics on how to use “mdfind” in the mdfind manual page.
One useful flag for the mdfind command is the “-live” flag, which if included will run a full search on the specified query, and then pause without showing any more output. Then, if a file or folder that matches the query is added or removed, the command will continue to inform you by showing query updates. This can be useful for monitoring specific files to see how the system or some routine you are running is handling them.
Any application that does it all as well with a GUI?
There are several applications available that can search the system quite well (The app called “Find Any File” is a good one). You can even set Spotlight to search system files, if needed.
T: Thanks for these periodic Terminal pieces. I’d like to be able to use Terminal more often.
And @MaX: I’ve been using EasyFind for many years and like it much.
Topher,
This article “Commands for finding files in the OS X Terminal” is timely as I’ve been trying to construct a ‘find command’ string that, for a given directory, will list file and subdirectory names with a specific ACL. After many hours of no success I’m ready to throw in the towel.
I used Apple’s Setup Assistant to migrate files from my old to new Mac, both running 10.9.2. By chance I found that many of the files copied over had this ACL added:
If possible, I want to identify the files and delete the ACL’s. Any help will be appreciated.
cisko
Here’s the ACL for the previous post:
0: user:_spotlight inherited allow list,search,readattr,readextattr,readsecurity,file_inherit,directory_inherit