A CLI organizer you didn’t know you needed — yet.
Project description
Filecraft
A CLI organizer you didn’t know you needed — yet.
This is the Python implementation of Filecraft, focused on safe and repeatable file organization workflows.
Demo
Watch Filecraft in action:
https://github.com/murtazapatel89100/Filecraft/blob/main/assets/demo-video.mp4
Requirements
- Python
>=3.10,<3.15
Distribution
- Package target: PyPI (
filecraft-cli) - CLI command:
filecraft - Standalone binary:
Filecraft(PyInstaller)
Install / Run
Option 1: Local development (Poetry)
poetry install
poetry run filecraft --help
Option 2: PyPI install (release users)
pip install filecraft-cli
filecraft --help
Option 2: Run module directly (without installing script)
PYTHONPATH=src python -m file_organiser_python.main --help
Commands
filecraft renamefilecraft separatefilecraft mergefilecraft revert
All commands support --dry-run to preview actions without moving files.
Working directory flags are validated before any --target-dir creation prompt.
rename
Renames files in working_dir and moves them to target_dir.
By default names are numeric (1.ext, 2.ext, ...); with --rename-with they become prefixed (name_1.ext, name_2.ext, ...).
Options
--working-dir PATH(default: current directory)--target-dir PATH(default: current directory)--recursive(include files from subdirectories at unlimited depth)--dry-run--history(save history file for revert)--rename-with TEXT(optional base name prefix, e.g.invoice)
If --target-dir is provided and does not exist, the CLI prompts to create it (y/n).
Declining exits with a --target-dir error.
Rename Example
filecraft rename --working-dir ./downloads --target-dir ./renamed --history
filecraft rename --working-dir ./downloads --target-dir ./renamed --rename-with invoice
separate
Separates files according to mode.
Separate Modes
extension: Move files of a specific extension (e.g..pdf) intoTARGET/PDFdate: Move files modified on a specific date (or today) intoTARGET/YYYY-MM-DDextension_and_date: Combine both filters intoTARGET/YYYY-MM-DD/EXTfile: Sort all files by file type category (IMAGES,VIDEOS,DOCUMENTS,ARCHIVES, etc.)
Separate Options
--mode [extension|date|extension_and_date|file](default:extension)--extension TEXT(required forextensionandextension_and_date)--file-type TEXT(optional forfile; accepts category likedocumentsor extension likepdf)--date YYYY-MM-DD(used bydateandextension_and_date; validated)--working-dir PATH(default: current directory)--target-dir PATH(default: current directory)--recursive(include files from subdirectories at unlimited depth)--dry-run--history
Separate Examples
filecraft separate --mode extension --extension pdf --working-dir ./in --target-dir ./out
filecraft separate --mode date --date 2026-03-01 --working-dir ./in --target-dir ./out
filecraft separate --mode extension_and_date --extension .jpg --date 2026-03-01 --working-dir ./in --target-dir ./out
filecraft separate --mode file --working-dir ./in --target-dir ./out
filecraft separate --mode file --file-type pdf --working-dir ./in --target-dir ./out
revert
Reverts moves using a history file.
Revert Options
--directory PATH(searches latest history in that directory; default: current directory)--history-file PATH(use a specific history file)--dry-run--keep-history(do not delete history file after successful revert)
Revert Examples
filecraft revert --directory ./out
filecraft revert --history-file ./out/.organizer_history_2026-03-01_12-00-00-123456.json
merge
Merges files from multiple working_dir locations into a single target_dir.
Merge Modes
extension: Merge files of a specific extension intoTARGET/EXTdate: Merge files modified on a specific date (or today) intoTARGET/YYYY-MM-DDextension_and_date: Combine both filters intoTARGET/YYYY-MM-DD/EXTfile: Merge all files by file type category (IMAGES,VIDEOS,DOCUMENTS,ARCHIVES, etc.)
Merge Options
--mode [extension|date|extension_and_date|file](default:extension)--extension TEXT(required forextensionandextension_and_date)--date YYYY-MM-DD(used bydateandextension_and_date; validated)--working-dir PATH(required, repeat for multiple source directories)--target-dir PATH(default: current directory)--recursive(include files from subdirectories at unlimited depth)--dry-run--history
When --recursive is set and multiple --working-dir flags are provided, Filecraft traverses all listed working directories recursively.
Merge Examples
filecraft merge --mode extension --extension pdf --working-dir ./downloads --working-dir ./desktop --target-dir ./merged
filecraft merge --mode date --date 2026-03-01 --working-dir ./in1 --working-dir ./in2 --target-dir ./merged
filecraft merge --mode extension_and_date --extension .jpg --date 2026-03-01 --working-dir ./camera --working-dir ./phone --target-dir ./merged
filecraft merge --mode file --working-dir ./in1 --working-dir ./in2 --target-dir ./merged
Notes
- History files are saved with a timestamped name like
.organizer_history_YYYY-MM-DD_HH-MM-SS-ffffff.json. - File collisions are handled safely by appending suffixes like
_1,_2, etc. - Compound extensions such as
.tar.gzare recognized when sorting by file type.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file filecraft_cli-1.1.0.tar.gz.
File metadata
- Download URL: filecraft_cli-1.1.0.tar.gz
- Upload date:
- Size: 14.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb44ee39d4f56e5a7a92b4e28c31f50334e6c8458758206ff2268c4da1f6bd7b
|
|
| MD5 |
45e9b2fe998c2833598e24c68d04c2aa
|
|
| BLAKE2b-256 |
4570e4049225ea7b8d7ada41e1baf109ea0451b12872b7c5371c683165f7ae67
|
Provenance
The following attestation bundles were made for filecraft_cli-1.1.0.tar.gz:
Publisher:
release.yml on murtazapatel89100/Filecraft
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
filecraft_cli-1.1.0.tar.gz -
Subject digest:
bb44ee39d4f56e5a7a92b4e28c31f50334e6c8458758206ff2268c4da1f6bd7b - Sigstore transparency entry: 1060040139
- Sigstore integration time:
-
Permalink:
murtazapatel89100/Filecraft@c7eca617e580c75d3eb2ecf7840da1bbdf41d193 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/murtazapatel89100
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c7eca617e580c75d3eb2ecf7840da1bbdf41d193 -
Trigger Event:
push
-
Statement type:
File details
Details for the file filecraft_cli-1.1.0-py3-none-any.whl.
File metadata
- Download URL: filecraft_cli-1.1.0-py3-none-any.whl
- Upload date:
- Size: 15.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0dab51054a1b1aa6e9be04f1ed8c91ec65631a242702cff0ca53107b674b85d4
|
|
| MD5 |
c762a44ab18c15e65b67d6d8713789df
|
|
| BLAKE2b-256 |
9e524cbe2a38d58589998f537bdc98b9f224d5b5a286fa3c88a27b873f3b33bc
|
Provenance
The following attestation bundles were made for filecraft_cli-1.1.0-py3-none-any.whl:
Publisher:
release.yml on murtazapatel89100/Filecraft
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
filecraft_cli-1.1.0-py3-none-any.whl -
Subject digest:
0dab51054a1b1aa6e9be04f1ed8c91ec65631a242702cff0ca53107b674b85d4 - Sigstore transparency entry: 1060040142
- Sigstore integration time:
-
Permalink:
murtazapatel89100/Filecraft@c7eca617e580c75d3eb2ecf7840da1bbdf41d193 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/murtazapatel89100
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c7eca617e580c75d3eb2ecf7840da1bbdf41d193 -
Trigger Event:
push
-
Statement type: