find is one of those commands that looks simple until you need it at 2am on a production box: locate a config file, find logs eating disk space, or hunt down files with dangerous permissions. It searches the filesystem by name, type, size, time, and permissions — and once you know the syntax, it beats clicking through a file manager every single time.

This guide covers the patterns you'll actually use, including the security angle: find is also how admins (and yes, attackers during privilege escalation) locate misconfigured files.

The basic shape

find <where> <conditions> <action> 
  • where — the directory to start from (. for here, / for everything)
  • conditions — name, type, size, age, permissions
  • action — print the path (default), delete, or run a command on each match

Finding files by name

find /etc -name "*.conf" # all .conf files under /etc find / -name "nginx.conf" 2>/dev/null # exact file, hide permission errors find . -iname "readme*" # case-insensitive 

The 2>/dev/null trick matters when searching from / — otherwise your results drown in "Permission denied" noise.

By type, size, and age

find /var -type d -name "log*" # directories only find /var/log -type f -size +100M # files over 100 MB — disk-space detective work find /home -type f -mtime -7 # modified in the last 7 days find /tmp -type f -mmin +60 # not modified in the last hour find . -type f -empty # empty files 

-mtime -7 means less than 7 days old; -mtime +30 means older than 30 days. That plus/minus sign trips everyone up at first.

Running commands on results: -exec

This is where find becomes a power tool:

find /var/log -name "*.log" -exec ls -lh {} \; find . -name "*.tmp" -delete find /var/log -name "*.gz" -mtime +90 -delete # clean old rotated logs 

{} is the placeholder for each found path, and \; ends the command. Use -exec ... + instead of \; to batch paths into fewer command invocations — much faster on large result sets.

Prefer xargs for pipelines:

find . -name "*.log" | xargs grep -l "ERROR" find . -type f -name "*.sh" | xargs chmod +x 

The security angle: permissions and privilege escalation

Admins use find to audit dangerous permissions; penetration testers use the exact same commands during privilege escalation. Knowing both sides makes you better at defense.

World-writable files — anything any user can modify is a risk:

find / -type f -perm -0002 2>/dev/null 

SUID binaries — programs that run as their owner (often root) regardless of who executes them:

find / -perm -4000 -type f 2>/dev/null 

A legitimate SUID list is short: passwd, sudo, su, a few others. An unexpected entry — say, a copy of bash in /tmp — is a red flag. SUID on a script is ignored by Linux, but SUID on a misconfigured binary is a classic root path.

Files owned by a specific user, useful when auditing a compromised account:

find / -user www-data -type f 2>/dev/null 

If you find a suspicious SUID binary, remove the bit rather than guessing: chmod u-s /path/to/binary.

Handy one-liners to keep

find . -type f | wc -l # count files recursively find / -xdev -type f -size +500M 2>/dev/null # huge files, stay on one filesystem find . -newer /etc/hostname -type f # files changed after a reference file 

Once these stick, find stops being a command you look up and becomes the fastest way to answer "where is that file and what is it doing."