CIS120 Linux Fundamentals by Scott Shaper

locate and find Commands

Think of searching for files on your Linux system like trying to find items in your home. The locate command is like asking someone who keeps a catalog of everything in your house - it's incredibly fast but might not know about things you've recently bought. The find command is like searching room by room yourself - it takes longer but will find even the newest items and can search based on detailed criteria like size, color, or when you got them. These powerful search tools help you track down files no matter how deeply they're tucked away in your system.

Quick Reference

Command What It Does Common Use
locate pattern Searches for files using a prebuilt database Quickly finding files by name when speed matters
updatedb Updates the locate database Making sure locate has current information
find path criteria Searches for files in real-time based on various criteria Finding files based on detailed conditions or recent changes

When to Use These Commands

The locate Command

Think of locate as the lightning-fast card catalog in a library. It doesn't search your actual files - instead, it checks a pre-built index that gets updated regularly. This makes locate extremely fast but means it might miss recent changes if the database hasn't been updated. Another limitation is that it can only search by filename, not by other attributes like file size, permissions, or modification time. For those searches, find is needed.

Option What It Does When to Use
-i Makes the search case-insensitive When you can't remember the exact capitalization
-r Uses regular expressions for searching When you need complex pattern matching
-n NUMBER Limits results to a specific number When you only need a few results from a large set
-e Shows only files that actually exist When you want to filter out deleted files still in the database
-c Shows only the count of matching files When you just need to know how many matches exist

Practical Examples

# Find all files containing "homework" in their name
locate homework
# Lists all files with "homework" in their path

# Find files containing "report" regardless of case
locate -i report
# Finds "Report.pdf", "REPORT.txt", "weekly_report", etc.

# Find at most 5 PDF files
locate -n 5 "*.pdf"
# Shows only the first 5 PDF files found

# Find all configuration files using regular expressions
locate -r "/etc/.*\.conf$"
# Finds all .conf files in /etc and its subdirectories

# Count how many Python files you have
locate -c "*.py"
# Shows just the number of Python files found

# Update the locate database (do this after creating new files)
sudo updatedb
# Refreshes the database so locate will find new files

The find Command

Think of find as a detective that searches your entire system in real-time. Unlike locate, it doesn't use a database but instead looks through your actual directories. This makes it more versatile and accurate for recent changes, but slower than locate, especially on large systems.

Basic Structure

The basic structure of a find command is:

find [starting directory] [options] [tests] [actions]

Common Tests (Search Criteria)

Test What It Does When to Use
-name "pattern" Matches files with the exact name/pattern When you know the exact filename or pattern (case-sensitive)
-iname "pattern" Like -name but case-insensitive When you're unsure about capitalization
-type f Matches only regular files When you don't want directories, links, etc.
-type d Matches only directories When you're looking for folders only
-size +10M Matches files larger than 10 megabytes When looking for large files taking up space
-size -10M Matches files smaller than 10 megabytes When looking for small files
-mtime -7 Files modified in the last 7 days When looking for recently changed files
-user username Files owned by a specific user When looking for files belonging to someone
-perm mode Files with specific permissions When checking for security issues or access rights
-empty Empty files or directories When cleaning up wasted space

Operators for Combining Tests

Operator What It Does When to Use
-and or just a space Both conditions must be true (logical AND) When files must satisfy multiple criteria
-or Either condition can be true (logical OR) When looking for files that match any of several criteria
! or -not Negates a condition (logical NOT) When excluding certain files from results
( ) Groups conditions (use with \( and \)) When creating complex conditions with proper precedence

Common Actions

Action What It Does When to Use
-print Prints matching files (default action) When you just want to see what matches
-delete Deletes matching files When cleaning up files (use with caution!)
-exec command {} \; Runs a command on each matching file When you need to process matching files
-exec command {} + Runs command once with all matches More efficient than \; for many files

Size Options

Size Format What It Means Example
+n Greater than n units -size +10M (larger than 10MB)
-n Less than n units -size -1M (smaller than 1MB)
n Exactly n units -size 100k (exactly 100KB)
c (bytes) Size in bytes -size 1024c (1024 bytes)
k (kilobytes) Size in kilobytes -size 10k (10KB)
M (megabytes) Size in megabytes -size 5M (5MB)
G (gigabytes) Size in gigabytes -size 1G (1GB)

Practical Examples

# Find all text files in your home directory
find ~ -name "*.txt"
# Lists all .txt files in your home directory and subdirectories

# Find large files that might be wasting space
find /home -type f -size +100M
# Finds files larger than 100MB in /home

# Find files between 10MB and 100MB in size (using "and" logic)
find /home -type f -size +10M -size -100M
# Finds files larger than 10MB but smaller than 100MB

# Find files modified in the last week but not in the last day
find /var/log -type f -mtime -7 -not -mtime -1
# Finds files modified between 1 and 7 days ago

# Find recently modified files
find /var/log -type f -mtime -2
# Finds files in /var/log modified in the last 2 days

# Find files with specific permissions
find /etc -type f -perm 0777
# Finds files with potentially insecure 777 permissions

# Find all empty files and directories
find /tmp -empty
# Lists all empty files and directories in /tmp

# Find files owned by a specific user
find /home -user john
# Finds files owned by user 'john'

# Find with complex conditions (find text files NOT owned by root)
find /opt -name "*.txt" -not -user root
# Finds text files that don't belong to root

# Find either PNG or JPG files (using "or" logic)
find ~/Pictures \( -name "*.png" -or -name "*.jpg" \)
# Finds all PNG or JPG files in your Pictures directory

# Find executable files that are not shell scripts
find /usr/bin -type f -executable -not -name "*.sh"
# Finds executable files that don't have the .sh extension

# Find files that match multiple criteria (AND example)
find /home -type f -user john -and -mtime -30
# Finds files owned by john that were modified in the last 30 days

# Find docx files OR pdf files (OR example)
find ~/Documents \( -name "*.docx" -o -name "*.pdf" \)
# Finds all Word documents or PDF files

# Find files with complex conditions using AND, OR, and NOT together
find ~/Projects -type f \( -name "*.java" -o -name "*.py" \) -not -path "*/test/*"
# Finds Java or Python files that are not in test directories

Using find with -exec and xargs

One of the most powerful features of find is the ability to perform actions on the files you find. You can do this with the -exec option or by piping to xargs.

Using -exec

# Find and delete all .tmp files
find /tmp -name "*.tmp" -exec rm {} \;
# The {} is replaced with each filename, and \; marks the end of the command

# Make all shell scripts executable
find ~/scripts -name "*.sh" -exec chmod +x {} \;
# Adds executable permission to all .sh files

# Find and copy all configuration files to a backup directory
find /etc -name "*.conf" -exec cp {} ~/backup/ \;
# Copies each .conf file to ~/backup/

# Find and list details about PDF files
find ~/Documents -name "*.pdf" -exec ls -lh {} \;
# Shows detailed listing of each PDF file

Using xargs

# Find and delete all .bak files (alternative to -exec)
find /home -name "*.bak" | xargs rm
# Pipes filenames to xargs which runs rm with those filenames as arguments

# Count lines of code in all Python files
find . -name "*.py" | xargs wc -l
# Counts lines in all Python files

# Create a tar archive of all HTML files
find . -name "*.html" | xargs tar -czf html_files.tar.gz
# Archives all HTML files into a single compressed file

# Replace text in multiple files
find . -name "*.txt" | xargs sed -i 's/old text/new text/g'
# Replaces "old text" with "new text" in all text files

Tips for Success

Common Mistakes to Avoid

Best Practices

Real-World Scenarios

Cleaning Up Temporary Files

# Find and remove files older than 30 days in /tmp
find /tmp -type f -mtime +30 -delete

# Explanation:
# This finds all regular files (-type f) in the /tmp directory
# that haven't been modified in more than 30 days (-mtime +30)
# and deletes them (-delete)
# This is a common system maintenance task to free up disk space

Finding and Fixing Permissions

# Find and fix world-writable files
find /home -type f -perm -0002 -exec chmod o-w {} \;

# Explanation:
# This finds all regular files in /home
# with world-writable permissions (potentially insecure)
# and removes the world-writable bit
# This improves security by preventing unauthorized users from modifying files

Creating a Backup of Important Files

# Back up all configuration files modified today
find /etc -name "*.conf" -type f -mtime 0 -exec cp {} ~/config_backup/ \;

# Explanation:
# This finds all .conf files in /etc
# that were modified today (-mtime 0)
# and copies them to a backup directory
# This helps preserve important changes before making system changes