Observed since 20 Oct, 21:06 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
A-file-organizer
Smart CLI tool to organize messy directories by file type, date, or size with safety features
A smart CLI tool to organize messy directories (Downloads, Desktop, etc.) by file type, date, or size — with safety features like dry-run, undo, and configurable ignore patterns.
--apply to execute, --undo to revertrich--recursivepipx install file-organizer
pip install file-organizer
git clone https://github.com/OWNER/file-organizer.git
cd file-organizer
pip install -e .
# Preview what would happen (dry-run)
file-organizer organize ~/Downloads --by type
# Actually organize by file type
file-organizer organize ~/Downloads --by type --apply
# Organize by date (year-month folders)
file-organizer organize ~/Downloads --by date --apply
# Organize by size
file-organizer organize ~/Downloads --by size --apply
# Organize recursively (includes subdirectories)
file-organizer organize ~/Downloads --by type --recursive --apply
# Export plan to JSON for review
file-organizer organize ~/Downloads --by type --export-plan plan.json --dry-run
# Skip confirmation prompt
file-organizer organize ~/Downloads --by type --apply -y
# Undo last operation
file-organizer undo
organizeOrganize files in a directory.
file-organizer organize [PATH] [OPTIONS]
Options:
--by, -b Organization mode: type, date, size (default: type)
--apply, -a Actually move files (default: dry-run)
--dry-run Show what would be done without changes
--yes, -y Skip confirmation prompt
--recursive, -r Organize files in subdirectories recursively
--export-plan FILE Export organization plan to JSON file
undoRevert the last organization operation.
file-organizer undo
configManage configuration.
file-organizer config [OPTIONS]
Options:
--show, -s Show current configuration
--set KEY=VALUE Set a configuration value
--reset Reset to default configuration
ignoreManage ignore patterns.
file-organizer ignore [OPTIONS]
Options:
--add, -a PATTERN Add ignore pattern
--remove, -r PATTERN Remove ignore pattern
--list, -l List ignore patterns
Configuration file: ~/.config/file-organizer/config.yaml (Linux/macOS) or %APPDATA%\file-organizer\config.yaml (Windows)
organize:
default_mode: type # type, date, or size
date_format: "%Y-%m" # strftime format for date mode
size_thresholds: # MB thresholds for size mode
small_mb: 1
large_mb: 100
create_subdirs: true # Create category subdirectories
ignore:
patterns: # Glob patterns to ignore
- "*.tmp"
- "*.crdownload"
- "*.part"
- ".DS_Store"
- "Thumbs.db"
hidden_files: true # Ignore hidden files
system_files: true # Ignore system files
safety:
dry_run_by_default: true # Default to dry-run
require_confirmation: false # Ask before applying
max_file_size_mb: 1000 # Skip files larger than this
preserve_timestamps: true # Preserve file timestamps
advanced:
follow_symlinks: false # Follow symbolic links
ignore_errors: false # Continue on errors
log_level: INFO # Logging level
Set default mode to date:
file-organizer config --set organize.default_mode=date
Add custom ignore pattern:
file-organizer ignore --add "*.bak"
--recursive)--apply), shows progress barThe last organization is logged to ~/.config/file-organizer/undo_log.json. Run file-organizer undo to move all files back to their original locations.
# Clone and setup
git clone https://github.com/OWNER/file-organizer.git
cd file-organizer
pip install -e ".[dev]"
# Run tests
pytest -v
# Lint
ruff check .
# Type check
mypy src/file_organizer
Non-Commercial License — see LICENSE for details.
This software is free for non-commercial use only. Commercial use requires a separate license. Attribution to Blake Nary (thedog737) is required for all uses.
Made with ❤️ using Python, Typer, and Rich
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
typerEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | typer>=0.9.0 | runtime |
pyyamlEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pyyaml>=6.0 | runtime |
richEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | rich>=13.0 | runtime |
watchfilesEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | watchfiles>=0.21.0 | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pytest>=7.4.0; extra == "dev" | runtime |
pytest-covEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | pytest-cov>=4.1.0; extra == "dev" | runtime |
ruffEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | ruff>=0.1.0; extra == "dev" | runtime |
mypyEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.10",
"evaluation": "NOT_EVALUATED"
} | mypy>=1.5.0; extra == "dev" | runtime |
bdist_wheel · 27.63 KB · Python py3
sdist · 26.83 KB · Python source
Observed since 20 Oct, 21:06 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:d8b102a6ec00c7abfee7d5fb92fd80cc207598dbd34bb6242b6929327470b3a9