fs_usage_sys
A Rust library that wraps macOS's fs_usage command to monitor file system events with support for glob patterns, process filtering, and operation type filtering.
Features
- 🔍 Real-time file system monitoring on macOS using
fs_usage - 🎯 Path filtering with glob patterns (
/Users/*/Documents/**/*.txt) - 🚫 Process filtering by PID or process name
- ⚡ Operation type filtering (reads, writes, creates, deletes, etc.)
- 🤖 AI assistant detection - distinguish between Claude/IDE vs manual text editor changes
- 📡 Event streaming via channels for real-time processing
- 🛡️ Noise reduction - filter out metadata operations
Quick Start
use ;
// Monitor file system operations
let mut monitor = new
.watch_path
.exclude_process
.exclude_process
.build?;
monitor.start?;
while let Ok = monitor.recv
Important: Don't use watch_writes_only() as it filters too aggressively. See Detecting Write Operations for comprehensive write detection patterns.
Installation
Add to your Cargo.toml:
[]
= "0.1.0"
Or use cargo add:
Requirements
- macOS only (uses the
fs_usagecommand) - Rust 1.70+
- Root/sudo permissions to run
fs_usage
Core Concepts
Operation Types
The library categorizes file system operations into logical groups:
Read- Reading file contents (read,pread,RdData)Write- Writing file contents (write,pwrite,WrData,ftruncate)Create- Creating files/directories (open,creat,mkdir)Delete- Removing files/directories (unlink,rmdir)Move- Renaming/moving (rename,renameat)Access- Checking file existence/permissions (access,stat64)Metadata- Reading file attributes (getxattr,getattrlist)All- No filtering (default)
Event Structure
Usage Examples
1. Basic File Monitoring
use FsUsageMonitorBuilder;
let mut monitor = new
.watch_path
.build?;
monitor.start?;
while let Ok = monitor.recv
2. AI Assistant vs Manual Edit Detection
use ;
use process;
let monitor = new
.watch_path
.watch_writes_only // Only modifications, not reads
.exclude_pid // Exclude self
.exclude_process
.build?;
monitor.start?;
while let Ok = monitor.recv
3. Advanced Filtering
use ;
// Monitor specific operations only
let monitor = new
.watch_path
.watch_operations
.exclude_processes
.build?;
// Or use convenience methods
let monitor = new
.watch_writes_only // Writes + Creates + Deletes + Moves
.exclude_metadata // Skip stat/lstat operations
.build?;
4. Process-Specific Monitoring
use FsUsageMonitorBuilder;
// Monitor only specific processes
let monitor = new
.watch_pid // Specific PID
.watch_pids // Multiple PIDs
.build?;
// Or exclude specific processes
let monitor = new
.exclude_process
.exclude_pids // Exclude self
.build?;
Builder API Reference
Path Filtering
watch_path(path)- Add a glob pattern to monitorwatch_paths(paths)- Add multiple glob patterns
Process Filtering
watch_pid(pid)- Monitor only specific process IDwatch_pids(pids)- Monitor multiple specific PIDsexclude_pid(pid)- Exclude a specific PIDexclude_pids(pids)- Exclude multiple PIDsexclude_process(name)- Exclude processes by nameexclude_processes(names)- Exclude multiple processes
Operation Type Filtering
watch_operations(types)- Custom operation filteringwatch_writes_only()- Only writes, creates, deletes, moveswatch_reads_only()- Only read operationsexclude_metadata()- Skip stat/lstat operations
Glob Patterns
The library supports standard glob patterns:
*- Match any number of characters (except/)**- Match any number of directories?- Match a single character[abc]- Match any character in brackets
Examples:
/tmp/*- Files directly in/tmp/tmp/**/*- All files in/tmpand subdirectories/Users/*/Documents/*.txt- Text files in any user's Documents/path/to/project/**/*.{rs,toml}- Rust and TOML files
Running Examples
All examples require sudo to access fs_usage:
# Basic monitoring
# Monitor with path filtering
# Process filtering and categorization
# Only write operations (no reads/stats)
# Debug mode - see all parsing
Common Use Cases
1. Development File Monitoring
Monitor your project directory for changes during development:
let monitor = new
.watch_path
.watch_writes_only
.exclude_process // Exclude build artifacts
.build?;
2. Security Monitoring
Detect unauthorized file modifications:
let monitor = new
.watch_path
.watch_path
.watch_operations
.build?;
3. Backup Detection
Monitor when files are modified for backup purposes:
let monitor = new
.watch_path
.watch_writes_only
.exclude_processes
.build?;
Error Handling
The library uses anyhow for error handling:
use Result;
Performance Considerations
- Use operation filtering to reduce noise (especially
exclude_metadata()) - Specific glob patterns perform better than monitoring everything
- Process filtering reduces parsing overhead
- Batch event processing rather than handling one-by-one
Troubleshooting
Permission Denied
# fs_usage requires root permissions
No Events Received
- Check glob patterns are correct
- Verify paths exist
- Try without filtering first
- Check process isn't excluded
Too Many Events
- Use
watch_writes_only()to reduce noise - Add process exclusions
- Use more specific glob patterns
License
MIT
Contributing
Contributions welcome! Please ensure:
- Tests pass:
cargo test - Examples work:
sudo cargo run --example basic_monitor - Documentation is updated