# SMV - Smart Move
A powerful, Rust-based drop-in replacement for the standard Unix `mv` command with intelligent filename transformation capabilities.
## Features
- **Drop-in replacement** for the standard Unix `mv` command
- **Interactive REPL Interface** with command history and tab completion
- **Smart File Renaming** with multiple transformation strategies:
- Convert to snake_case (`document-name.pdf` → `document_name.pdf`)
- Convert to kebab-case (`document_name.pdf` → `document-name.pdf`)
- Convert to Title Case (`document_name.pdf` → `Document Name.pdf`)
- Convert to camelCase (`document_name.pdf` → `documentName.pdf`)
- Convert to PascalCase (`document_name.pdf` → `DocumentName.pdf`)
- Convert to lowercase or UPPERCASE
- Clean up spaces and special characters
- **Preview Mode** - See changes before they're applied
- **Batch Processing** - Apply transformations to multiple files at once
- **Undo Functionality** - Safely revert changes
- **Safety Features** - File backups and conflict detection
## Installation
### Using Cargo
```bash
cargo install smv
```
### From Source
```bash
# Clone the repository
git clone https://github.com/jwliles/smv.git
cd smv
# Build and install
cargo install --path .
```
## Usage
### Basic Usage (like standard mv)
SMV works exactly like the standard `mv` command for basic moving and renaming:
```bash
# Move a file to another location
smv file.txt /path/to/destination/
# Move multiple files to a directory
smv file1.txt file2.txt destination_directory/
# Rename a file
smv old_name.txt new_name.txt
```
### Transformation Mode
Apply transformations to filenames:
```bash
# Convert filenames to snake_case
smv --snake *.txt
# Convert filenames to kebab-case with preview
smv --preview --kebab *.pdf
# Clean up spaces and special characters recursively
smv --recursive --clean --directory /path/to/messy/files/
# Convert to Title Case for specific extensions
smv --title --extensions "md,txt" documents/
# Combine transformations with standard move behavior
smv --snake *.txt destination_folder/
```
### Interactive Mode
Launch the interactive REPL interface:
```bash
# Start interactive session
smv -i
# or
smv --interactive
```
In the interactive shell:
```
smv> ls
document.pdf document.docx image.jpg notes.txt
smv> preview snake *.pdf
document.pdf → document.pdf (no change needed)
smv> rename notes.txt
...
Select transformation:
1. Clean up spaces and special characters
...
4. Convert to Title Case
...
Preview of changes:
"notes.txt" → "Notes.txt"
Apply these changes? [y/N] y
Renamed: "notes.txt" → "Notes.txt"
smv> undo
Operation undone successfully.
smv> help
Commands:
preview <transform> <files> - Show transformation without applying
apply <transform> <files> - Apply transformation
rename <files> --options - Interactive renaming wizard
undo - Revert last operation
cd <directory> - Change directory
ls [pattern] - List files
help - Show this help
quit - Exit program
```
## Full Command Options
```
Options:
-i, --interactive Launch interactive REPL interface
-p, --preview Preview changes without applying them
-r, --recursive Process subdirectories recursively
-e, --extensions <EXTENSIONS> Comma-separated list of file extensions to process
-a, --remove-accents Remove accents from filenames
--clean Clean up spaces and special characters
--snake Convert filenames to snake_case
--kebab Convert filenames to kebab-case
--title Convert filenames to Title Case
--camel Convert filenames to camelCase
--pascal Convert filenames to PascalCase
--lower Convert filenames to lowercase
--upper Convert filenames to UPPERCASE
--dry-run Same as preview - show changes without applying
--exclude <PATTERNS> Comma-separated patterns to exclude
--max-history-size <SIZE> Maximum number of operations in history [default: 50]
-h, --help Print help
-V, --version Print version
```
## Transformations
| `clean` | Clean up spaces and special characters | `My File (1).txt` → `My File 1.txt` |
| `snake` | Convert to snake_case | `My-File.txt` → `my_file.txt` |
| `kebab` | Convert to kebab-case | `My_File.txt` → `my-file.txt` |
| `title` | Convert to Title Case | `my_file.txt` → `My File.txt` |
| `camel` | Convert to camelCase | `my_file.txt` → `myFile.txt` |
| `pascal` | Convert to PascalCase | `my_file.txt` → `MyFile.txt` |
| `lower` | Convert to lowercase | `MyFile.txt` → `myfile.txt` |
| `upper` | Convert to UPPERCASE | `myFile.txt` → `MYFILE.TXT` |
## Safety Features
### Backups
SMV automatically creates backups of modified files in `~/.config/smv/backups/`. This allows the undo functionality to work even after the program has been closed and reopened.
### Undo Functionality
The undo command reverts the most recent operation. In interactive mode, you can use:
```
smv> undo
```
### Conflict Detection
SMV will not overwrite existing files unless explicitly instructed to do so, preventing accidental data loss.
## Requirements
- Rust (Minimum supported version: 1.85.0)
- Standard system libraries
## Roadmap
- [ ] **Multi-step transformation pipelines**: Chain multiple transforms together
```bash
smv --transform "clean,snake,replace:space:_" file.txt
```
- [ ] **Regular expression-based transformations**: Advanced pattern replacement
```bash
smv --replace "old:new" file.txt
smv --character-replace "digits:X" file*.txt
```
- [ ] **Custom user-defined transformations**: Save your own transform combinations
```bash
smv --save "my-format:clean,snake,upper"
smv --transform my-format file.txt
```
- [ ] **Configuration file system**: Persistent settings and defaults
- [ ] **Directory synchronization features**: Keep renamed files in sync
- [ ] **Plugin system for add-ons**: Extend functionality
- [ ] **Enhanced REPL with syntax highlighting**: Improved interactive mode
- [ ] **Color-coded preview output**: Visual differentiation of changes
## License
MIT License