How to locate binaries, man pages, and source → whereis
How to Locate Binaries, Man Pages, and Source Files Using the whereis Command
Table of Contents
1. [Introduction](#introduction)
2. [Prerequisites](#prerequisites)
3. [Understanding the whereis Command](#understanding-the-whereis-command)
4. [Basic Syntax and Options](#basic-syntax-and-options)
5. [Step-by-Step Usage Examples](#step-by-step-usage-examples)
6. [Advanced Features and Options](#advanced-features-and-options)
7. [Practical Use Cases](#practical-use-cases)
8. [Comparing whereis with Similar Commands](#comparing-whereis-with-similar-commands)
9. [Troubleshooting Common Issues](#troubleshooting-common-issues)
10. [Best Practices and Professional Tips](#best-practices-and-professional-tips)
11. [Conclusion](#conclusion)
Introduction
The `whereis` command is an essential utility in Linux and Unix-like systems that helps system administrators, developers, and users quickly locate the binary executables, manual pages, and source files for specific programs. Unlike other file-finding commands, `whereis` is specifically designed to search for program-related files in standard system directories, making it incredibly efficient for system administration tasks.
In this comprehensive guide, you'll learn how to effectively use the `whereis` command to streamline your workflow, troubleshoot system issues, and locate critical system files. Whether you're a beginner learning Linux fundamentals or an experienced administrator looking to optimize your command-line efficiency, this article provides detailed explanations, practical examples, and professional insights to master the `whereis` command.
Prerequisites
Before diving into the `whereis` command, ensure you have:
- Basic Linux/Unix Knowledge: Understanding of command-line interface and basic terminal operations
- System Access: Access to a Linux, Unix, or Unix-like system (including macOS terminal)
- User Permissions: Standard user privileges (root access not required for basic operations)
- Terminal Emulator: Access to a terminal or command prompt
- Basic Understanding: Familiarity with concepts like binaries, manual pages, and file systems
System Requirements
The `whereis` command is typically pre-installed on most Linux distributions and Unix systems. To verify its availability, run:
```bash
whereis whereis
```
This command should return the location of the `whereis` binary itself, confirming its availability on your system.
Understanding the whereis Command
What is whereis?
The `whereis` command is a file location utility that searches for executables, source files, and manual pages in specific directories defined by the system. Unlike general-purpose search commands like `find` or `locate`, `whereis` focuses exclusively on program-related files and searches only in standard system directories, making it much faster and more targeted.
How whereis Works
The `whereis` command operates by searching through predefined directory paths that typically contain:
- Binary executables: `/bin`, `/usr/bin`, `/usr/local/bin`, `/sbin`, `/usr/sbin`
- Manual pages: `/usr/share/man`, `/usr/local/man`, `/usr/man`
- Source files: `/usr/src`, `/usr/local/src`
This targeted approach makes `whereis` significantly faster than comprehensive search tools while providing the specific information most users need about system programs.
Key Advantages
1. Speed: Searches only standard directories, making it faster than comprehensive search tools
2. Specificity: Designed specifically for program-related files
3. Simplicity: Easy-to-use syntax with minimal learning curve
4. Reliability: Consistent results across different Unix-like systems
5. Efficiency: Low system resource usage compared to recursive search commands
Basic Syntax and Options
Command Syntax
The basic syntax of the `whereis` command follows this pattern:
```bash
whereis [options] [program_name]
```
Essential Options
| Option | Description |
|--------|-------------|
| `-b` | Search only for binaries (executables) |
| `-m` | Search only for manual pages |
| `-s` | Search only for source files |
| `-u` | Show only unusual entries (programs without expected files) |
| `-B` | Specify custom binary search paths |
| `-M` | Specify custom manual page search paths |
| `-S` | Specify custom source file search paths |
| `-f` | Terminate directory list and begin file names |
Output Format
The `whereis` command returns results in the following format:
```
program_name: /path/to/binary /path/to/manual /path/to/source
```
For example:
```bash
ls: /bin/ls /usr/share/man/man1/ls.1.gz
```
Step-by-Step Usage Examples
Example 1: Basic Program Location
To find all files related to a specific program, use the basic `whereis` command:
```bash
whereis ls
```
Output:
```
ls: /bin/ls /usr/share/man/man1/ls.1.gz
```
Explanation: This shows that the `ls` binary is located at `/bin/ls` and its manual page is at `/usr/share/man/man1/ls.1.gz`.
Example 2: Finding Only Binary Files
To locate only the executable binary of a program:
```bash
whereis -b python3
```
Output:
```
python3: /usr/bin/python3
```
Explanation: The `-b` option restricts the search to binary files only, showing just the executable location.
Example 3: Locating Manual Pages
To find only the manual pages for a command:
```bash
whereis -m gcc
```
Output:
```
gcc: /usr/share/man/man1/gcc.1.gz
```
Explanation: This locates only the manual page file for the `gcc` compiler.
Example 4: Searching for Source Files
To find source files for a program:
```bash
whereis -s kernel
```
Output:
```
kernel: /usr/src/kernel
```
Explanation: This searches for source files related to the kernel in standard source directories.
Example 5: Multiple Program Search
You can search for multiple programs simultaneously:
```bash
whereis vim nano emacs
```
Output:
```
vim: /usr/bin/vim /usr/share/man/man1/vim.1.gz
nano: /bin/nano /usr/share/man/man1/nano.1.gz
emacs: /usr/bin/emacs /usr/share/man/man1/emacs.1.gz
```
Explanation: This provides location information for all three text editors in a single command.
Advanced Features and Options
Custom Search Paths
You can specify custom directories for `whereis` to search using the `-B`, `-M`, and `-S` options:
Custom Binary Paths
```bash
whereis -B /custom/bin /another/bin -f program_name
```
Example:
```bash
whereis -B /opt/bin /usr/local/bin -f custom_tool
```
Custom Manual Page Paths
```bash
whereis -M /custom/man /another/man -f program_name
```
Custom Source Paths
```bash
whereis -S /custom/src /another/src -f program_name
```
Finding Unusual Entries
The `-u` option helps identify programs with missing components:
```bash
whereis -u -b -m -s *
```
This command finds programs that don't have all three components (binary, manual page, and source files).
Combining Options
You can combine multiple options for specific searches:
```bash
whereis -b -m python3
```
This searches for both binary and manual page files for Python 3.
Practical Use Cases
System Administration Tasks
1. Verifying Software Installation
When troubleshooting software issues, verify if programs are properly installed:
```bash
whereis apache2 nginx mysql
```
This helps confirm whether web servers and databases are installed and accessible.
2. Locating Configuration Files
While `whereis` doesn't directly find configuration files, it helps locate programs whose configurations you need:
```bash
whereis ssh
```
```
ssh: /usr/bin/ssh /usr/share/man/man1/ssh.1.gz
```
3. Checking Development Tools
For development environments, verify the presence of essential tools:
```bash
whereis gcc g++ make cmake git
```
Development Workflows
1. Documentation Access
Quickly locate manual pages for programming tools:
```bash
whereis -m gdb valgrind strace
```
2. Compiler and Tool Verification
Ensure development tools are available:
```bash
whereis -b java javac python3 node npm
```
3. Source Code Location
Find source files for system programs:
```bash
whereis -s glibc linux-headers
```
Security and Auditing
1. Binary Verification
Locate system binaries for security auditing:
```bash
whereis -b sudo su passwd
```
2. System Tool Inventory
Create an inventory of installed system tools:
```bash
whereis netstat ss iptables ufw
```
Comparing whereis with Similar Commands
whereis vs. which
| Feature | whereis | which |
|---------|---------|-------|
| Purpose | Locates binaries, man pages, source files | Locates only executable files in PATH |
| Search Scope | Standard system directories | Only PATH directories |
| Output | Multiple file types | Only executable path |
| Speed | Fast (limited directories) | Very fast (PATH only) |
Example Comparison:
```bash
whereis python3
python3: /usr/bin/python3 /usr/share/man/man1/python3.1.gz
which python3
/usr/bin/python3
```
whereis vs. locate
| Feature | whereis | locate |
|---------|---------|--------|
| Database | No database required | Requires updatedb |
| Search Scope | Standard directories only | Entire filesystem |
| File Types | Program-related files | All file types |
| Speed | Fast | Very fast (with updated database) |
| Maintenance | No maintenance needed | Requires database updates |
whereis vs. find
| Feature | whereis | find |
|---------|---------|------|
| Flexibility | Limited to standard paths | Highly flexible |
| Speed | Very fast | Can be slow for large searches |
| Complexity | Simple syntax | Complex syntax with many options |
| Resource Usage | Low | Can be resource-intensive |
Troubleshooting Common Issues
Issue 1: Command Not Found
Problem: The `whereis` command itself is not found.
Solution:
```bash
Check if whereis is installed
ls /usr/bin/whereis
If not found, install it (Ubuntu/Debian)
sudo apt-get install util-linux
For CentOS/RHEL
sudo yum install util-linux
```
Issue 2: No Results Returned
Problem: `whereis` returns no results for a known program.
Possible Causes and Solutions:
1. Program not in standard directories:
```bash
# Use which to find the actual location
which program_name
# Use find for comprehensive search
find / -name program_name 2>/dev/null
```
2. Custom installation location:
```bash
# Specify custom search paths
whereis -B /opt/bin /usr/local/bin -f program_name
```
Issue 3: Incomplete Results
Problem: Missing manual pages or source files in results.
Solutions:
1. Install development packages:
```bash
# Ubuntu/Debian
sudo apt-get install manpages-dev
# CentOS/RHEL
sudo yum install man-pages
```
2. Install source packages:
```bash
# Ubuntu/Debian (example for kernel source)
sudo apt-get install linux-source
```
Issue 4: Permission Denied Errors
Problem: Access denied when searching certain directories.
Solution:
```bash
Run with elevated privileges if necessary
sudo whereis program_name
Or use find with error suppression
find / -name program_name 2>/dev/null
```
Issue 5: Outdated Information
Problem: Results show outdated or incorrect paths.
Solutions:
1. Clear shell hash table:
```bash
hash -r
```
2. Update locate database (if using locate as alternative):
```bash
sudo updatedb
```
3. Verify actual file existence:
```bash
ls -la $(whereis -b program_name | cut -d: -f2)
```
Best Practices and Professional Tips
Performance Optimization
1. Use Specific Options
Instead of searching for all file types, use specific options when you know what you need:
```bash
Faster - specific search
whereis -b program_name
Slower - comprehensive search
whereis program_name
```
2. Batch Searches
Search for multiple programs in a single command to reduce overhead:
```bash
Efficient batch search
whereis program1 program2 program3
Less efficient individual searches
whereis program1
whereis program2
whereis program3
```
Scripting Integration
1. Error Handling in Scripts
```bash
#!/bin/bash
program_name="$1"
if [ -z "$program_name" ]; then
echo "Usage: $0 "
exit 1
fi
result=$(whereis -b "$program_name")
if [[ "$result" == ": " ]] && [[ "$result" != *": " ]]; then
echo "Found: $result"
else
echo "Program '$program_name' not found in standard directories"
exit 1
fi
```
2. Parsing whereis Output
```bash
#!/bin/bash
Extract binary path from whereis output
get_binary_path() {
local program="$1"
local result=$(whereis -b "$program")
echo "$result" | cut -d: -f2 | awk '{print $1}'
}
binary_path=$(get_binary_path "python3")
if [ -n "$binary_path" ]; then
echo "Binary found at: $binary_path"
fi
```
System Administration Tips
1. Creating System Inventories
```bash
#!/bin/bash
Create inventory of essential system tools
essential_tools=("bash" "ls" "cp" "mv" "rm" "mkdir" "chmod" "chown" "ps" "top")
echo "System Tool Inventory"
echo "===================="
for tool in "${essential_tools[@]}"; do
result=$(whereis -b "$tool")
if [[ "$result" != *": " ]]; then
echo "✓ $tool: Found"
else
echo "✗ $tool: Missing"
fi
done
```
2. Development Environment Verification
```bash
#!/bin/bash
Verify development environment setup
dev_tools=("gcc" "g++" "make" "git" "python3" "node" "npm")
echo "Development Environment Check"
echo "============================"
missing_tools=()
for tool in "${dev_tools[@]}"; do
if whereis -b "$tool" | grep -q ":.*[^[:space:]]"; then
echo "✓ $tool: Available"
else
echo "✗ $tool: Not found"
missing_tools+=("$tool")
fi
done
if [ ${#missing_tools[@]} -gt 0 ]; then
echo ""
echo "Missing tools: ${missing_tools[*]}"
echo "Consider installing the missing development tools."
fi
```
Security Considerations
1. Verify Binary Integrity
```bash
After using whereis to locate a binary, verify its integrity
binary_path=$(whereis -b sudo | cut -d: -f2 | awk '{print $1}')
if [ -n "$binary_path" ]; then
ls -la "$binary_path"
file "$binary_path"
# Check if it's a legitimate binary
if file "$binary_path" | grep -q "executable"; then
echo "Binary appears legitimate"
else
echo "Warning: Unusual file type detected"
fi
fi
```
2. Monitor System Changes
```bash
#!/bin/bash
Create baseline of system binaries
create_baseline() {
local baseline_file="system_binaries_baseline.txt"
local important_bins=("sudo" "su" "passwd" "ssh" "sshd" "login")
echo "Creating system binary baseline..."
> "$baseline_file"
for bin in "${important_bins[@]}"; do
whereis -b "$bin" >> "$baseline_file"
done
echo "Baseline created: $baseline_file"
}
```
Documentation and Maintenance
1. Automated Documentation
```bash
#!/bin/bash
Generate system documentation
generate_system_doc() {
local doc_file="system_programs.md"
local categories=("editors:vim,nano,emacs" "compilers:gcc,g++,clang" "utilities:grep,awk,sed")
echo "# System Programs Documentation" > "$doc_file"
echo "Generated on: $(date)" >> "$doc_file"
echo "" >> "$doc_file"
for category in "${categories[@]}"; do
local cat_name="${category%%:*}"
local programs="${category##*:}"
echo "## ${cat_name^}" >> "$doc_file"
echo "" >> "$doc_file"
IFS=',' read -ra PROGS <<< "$programs"
for prog in "${PROGS[@]}"; do
local result=$(whereis "$prog")
if [[ "$result" != *": " ]]; then
echo "- $prog: $result" >> "$doc_file"
fi
done
echo "" >> "$doc_file"
done
}
```
Conclusion
The `whereis` command is an indispensable tool for system administrators, developers, and Linux users who need to quickly locate program-related files. Its focused approach to searching standard system directories makes it both fast and reliable for finding binaries, manual pages, and source files.
Key Takeaways
1. Efficiency: `whereis` provides fast, targeted searches for program-related files
2. Simplicity: The straightforward syntax makes it accessible to users of all skill levels
3. Versatility: Various options allow for specific searches based on file type
4. Integration: Easy to incorporate into scripts and automated workflows
5. Reliability: Consistent behavior across different Unix-like systems
Next Steps
To further enhance your command-line proficiency:
1. Practice Integration: Combine `whereis` with other commands in your daily workflows
2. Script Development: Create custom scripts that leverage `whereis` for system administration tasks
3. Explore Alternatives: Learn complementary commands like `which`, `type`, and `command -v`
4. System Monitoring: Implement `whereis` in system monitoring and security scripts
5. Documentation: Use `whereis` to create and maintain system documentation
Final Recommendations
- Always verify the existence and integrity of files found by `whereis`
- Combine `whereis` with other tools for comprehensive system analysis
- Regular practice with different options will improve your efficiency
- Consider the security implications when using `whereis` in scripts
- Keep your system updated to ensure accurate results from `whereis`
By mastering the `whereis` command and following the best practices outlined in this guide, you'll significantly improve your ability to navigate and manage Unix-like systems effectively. Whether you're troubleshooting issues, setting up development environments, or performing security audits, `whereis` will prove to be an invaluable addition to your command-line toolkit.