The `find` command in Linux searches your filesystem with powerful criteria like name, size, and modification time. Learning how to use the find command in linux is essential for anyone who manages files, scripts, or servers. This guide walks you through every major feature with clear examples you can test right away.
Basic Syntax Of The Find Command
The simplest form of `find` needs only a starting directory and a search expression. Type this in your terminal:
find /home -name "*.txt"
This searches the `/home` directory for any file ending with `.txt`. The command outputs the full path of each match.
Understanding The Three Parts
- Path: Where to start searching (`.` for current directory)
- Expression: What to look for (name, type, size)
- Action: What to do with results (print, delete, execute)
If you omit the path, `find` uses the current directory. If you omit the action, it prints results by default.
How To Use The Find Command In Linux
Now let’s get into practical usage. The key is combining options to narrow down exactly what you need.
Searching By Name
The `-name` option is the most common. Use it to match exact filenames or patterns:
find . -name "report.pdf"
For case-insensitive searches, use `-iname`:
find . -iname "Report.PDF"
Wildcards work too. The asterisk matches any characters:
find /var/log -name "*.log"
The question mark matches a single character:
find . -name "file?.txt"
Searching By File Type
Use `-type` to filter by file kind. Common types include:
f– regular filesd– directoriesl– symbolic linkss– sockets
Example: find all directories under `/etc`:
find /etc -type d
Example: find all symbolic links in your home folder:
find ~ -type l
Searching By Size
The `-size` option lets you find files based on their size. Use these suffixes:
c– bytesk– kilobytesM– megabytesG– gigabytes
Find files larger than 100MB:
find . -size +100M
Find files smaller than 1KB:
find . -size -1k
Find files exactly 512 bytes:
find . -size 512c
Searching By Modification Time
Time-based searches are crucial for finding recent or old files. Use these flags:
-mtime– modification time (days)-atime– access time (days)-ctime– change time (days)-mmin– modification time (minutes)
Find files modified in the last 7 days:
find . -mtime -7
Find files accessed more than 30 days ago:
find . -atime +30
Find files changed exactly 2 days ago:
find . -ctime 2
Combining Multiple Criteria
You can chain conditions with logical operators. By default, multiple conditions are ANDed together.
Find large log files modified recently:
find /var/log -name "*.log" -size +10M -mtime -1
Use `-o` for OR conditions:
find . -name "*.txt" -o -name "*.md"
Group conditions with parentheses (escape them in shell):
find . \( -name "*.tmp" -o -name "*.bak" \) -size +1M
Taking Action On Found Files
The real power of `find` is acting on results automatically.
Deleting Files
Use `-delete` to remove matching files. Be careful—this is permanent:
find . -name "*.tmp" -delete
Always test first with `-print` or limit the search before deleting.
Executing Commands
The `-exec` option runs a command on each result. Use `{}` as a placeholder for the filename, and end with `\;`:
find . -name "*.jpg" -exec chmod 644 {} \;
To run the command once for all files, use `+` instead of `\;`:
find . -name "*.log" -exec rm {} +
Using Ok For Confirmation
`-ok` works like `-exec` but prompts you before each action:
find . -name "*.conf" -ok cp {} /backup/ \;
This is safer for destructive operations.
Advanced Find Techniques
Searching By Permissions
Use `-perm` to find files with specific permissions. Match exact permissions:
find . -perm 644
Match files with at least those permissions (using `-`):
find . -perm -4000
Find setuid files (security audit):
find / -perm -4000 -type f
Searching By Owner And Group
Find files owned by a specific user:
find . -user alice
Find files belonging to a group:
find . -group developers
Limiting Search Depth
Control how deep `find` goes into subdirectories. Use `-maxdepth`:
find . -maxdepth 2 -name "*.txt"
Use `-mindepth` to skip the top level:
find . -mindepth 3 -name "*.pdf"
Using Regular Expressions
For complex patterns, use `-regex`:
find . -regex ".*\.\(txt\|md\)"
This matches files ending in `.txt` or `.md`. The regex matches the full path, so include `.*` at the start.
Practical Examples For Everyday Use
Clean Up Temporary Files
find /tmp -type f -atime +7 -delete
Removes temp files not accessed in a week.
Find Large Files To Free Space
find / -type f -size +500M -exec ls -lh {} \;
Lists files over 500MB with human-readable sizes.
Backup Configuration Files
find /etc -name "*.conf" -exec cp {} /backup/configs/ \;
Find Empty Files And Directories
find . -empty
Search For Files With Specific Content
Combine `find` with `grep`:
find . -name "*.py" -exec grep -l "def main" {} \;
This finds Python files containing “def main”.
Common Pitfalls And How To Avoid Them
Forgetting To Escape Special Characters
When using `-exec`, always end with `\;` or `+`. The semicolon must be escaped so the shell doesn’t interpret it.
Running Delete Without Testing
Always test with `-print` first:
find . -name "*.tmp" -print
Then replace `-print` with `-delete` after verifying.
Ignoring Hidden Files
By default, `find` does not search hidden files (starting with `.`). Use `-name “.*”` explicitly:
find . -name ".*" -type f
Not Quoting Wildcards
If you don’t quote the pattern, the shell expands it before `find` runs. Always use quotes:
find . -name "*.txt" # correct
find . -name *.txt # wrong
Performance Tips For Large Filesystems
Searching the entire filesystem can be slow. Use these strategies:
- Start from a specific directory, not root
- Use `-maxdepth` to limit recursion
- Avoid `-exec` for thousands of files; use `+` instead
- Use `-prune` to exclude directories
Exclude `/proc` and `/sys` when searching root:
find / -path /proc -prune -o -path /sys -prune -o -name "*.conf" -print
Frequently Asked Questions
How Do I Find Files Modified In The Last 24 Hours?
Use `-mtime 0` or `-mmin -1440`:
find . -mtime 0
Can I Find Files By Both Name And Size?
Yes, combine conditions:
find . -name "*.log" -size +10M
What’s The Difference Between -Exec And -Ok?
`-exec` runs the command automatically. `-ok` prompts for confirmation before each action.
How Do I Exclude A Directory From Search?
Use `-prune`:
find . -path ./node_modules -prune -o -name "*.js" -print
Why Does Find Show “Permission Denied” Errors?
You don’t have read access to some directories. Redirect errors to silence them:
find / -name "*.txt" 2>/dev/null
Putting It All Together
The `find` command is one of the most versatile tools in Linux. With practice, you’ll use it daily for system administration, development, and file management. Start with simple name searches, then gradually add size, time, and action options. Always test with `-print` before destructive actions. Over time, you’ll develop your own patterns and shortcuts that make file hunting effortless.
Remember that the man page is your friend—run `man find` to see every option. But this guide covers 90% of what you’ll ever need. Go ahead and open a terminal, try the examples, and soon you’ll wonder how you ever managed without it.