{"id":13495489,"url":"https://github.com/tfeldmann/organize","last_synced_at":"2025-05-13T17:09:23.809Z","repository":{"id":38916888,"uuid":"104198193","full_name":"tfeldmann/organize","owner":"tfeldmann","description":"The file management automation tool.","archived":false,"fork":false,"pushed_at":"2025-05-05T20:56:56.000Z","size":7820,"stargazers_count":2577,"open_issues_count":51,"forks_count":156,"subscribers_count":30,"default_branch":"main","last_synced_at":"2025-05-05T21:50:04.634Z","etag":null,"topics":["automatic","command-line-tool","document-management","file-management","platform-independent","python3","rule-based"],"latest_commit_sha":null,"homepage":"http://organize.readthedocs.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tfeldmann.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"tfeldmann","patreon":null,"open_collective":null,"ko_fi":"tfeldmann","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":["paypal.me/tfeldmann42"]}},"created_at":"2017-09-20T10:00:28.000Z","updated_at":"2025-05-05T13:50:46.000Z","dependencies_parsed_at":"2024-02-04T11:42:10.488Z","dependency_job_id":"72553f5b-4539-4c52-986b-62cbf152ce3e","html_url":"https://github.com/tfeldmann/organize","commit_stats":{"total_commits":607,"total_committers":13,"mean_commits":46.69230769230769,"dds":"0.24876441515650738","last_synced_commit":"56d0be533ca63cb35dcdb8b83863aec5f7ae2e54"},"previous_names":[],"tags_count":59,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tfeldmann%2Forganize","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tfeldmann%2Forganize/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tfeldmann%2Forganize/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tfeldmann%2Forganize/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tfeldmann","download_url":"https://codeload.github.com/tfeldmann/organize/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253990468,"owners_count":21995774,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automatic","command-line-tool","document-management","file-management","platform-independent","python3","rule-based"],"created_at":"2024-07-31T19:01:35.243Z","updated_at":"2025-05-13T17:09:18.797Z","avatar_url":"https://github.com/tfeldmann.png","language":"Python","readme":"\u003cp align=\"center\"\u003e\n  \u003c!--\u003cimg width=\"623\" height=\"168\" src=\"https://github.com/tfeldmann/organize/raw/gh-pages/img/organize.svg?sanitize=true\" alt=\"organize logo\"\u003e--\u003e\n  \u003ca href=\"https://tfeldmann.github.io/organize/changelog/\" target=\"_blank\"\u003e\u003cimg width=\"100%\" src=\"https://github.com/tfeldmann/organize/blob/main/docs/img/organize-v3.jpg?raw=true\" alt=\"organize v3 is out\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n\u003ca href=\"https://github.com/tfeldmann/organize/actions/workflows/tests.yml\"\u003e\u003cimg src=\"https://github.com/tfeldmann/organize/actions/workflows/tests.yml/badge.svg\" title=\"tests\"\u003e\u003c/a\u003e\n\u003ca href=\"https://organize.readthedocs.io/en/latest/?badge=latest\"\u003e\u003cimg src=\"https://readthedocs.org/projects/organize/badge/?version=latest\" title=\"Documentation Status\"\u003e\u003c/a\u003e\n\u003ca href=\"https://results.pre-commit.ci/latest/github/tfeldmann/organize/main\"\u003e\u003cimg src=\"https://results.pre-commit.ci/badge/github/tfeldmann/organize/main.svg\" title=\"pre-commit.ci status\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/tfeldmann/organize/blob/main/LICENSE.txt\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\" title=\"License\"\u003e\u003c/a\u003e\n\u003ca href=\"https://pypi.org/project/organize-tool/\"\u003e\u003cimg src=\"https://img.shields.io/pypi/v/organize-tool\" title=\"PyPI Version\"\u003e\u003c/a\u003e\n\n\u003c/div\u003e\n\n---\n\n\u003cp align=\"center\"\u003e \u003cb\u003eorganize\u003c/b\u003e - The file management automation tool\n\u003cbr\u003e\n\u003ca href=\"https://organize.readthedocs.io/\" target=\"_blank\"\u003eFull documentation at Read the docs\u003c/a\u003e\n\u003c/p\u003e\n\n\n## v3 is now available\n\nThe new version should be *much* faster and fix a lot of bugs. It also comes with\na some new actions, filters and options.\n\nIf you encounter any other bugs or problems during the migration, please reach out!\n\n- [See the changelog](https://tfeldmann.github.io/organize/changelog/)\n- [Migration guide](https://tfeldmann.github.io/organize/migrating/#migrating-from-v2-to-v3)\n\n## About\n\nYour desktop is a mess? You cannot find anything in your downloads and\ndocuments? Sorting and renaming all these files by hand is too tedious?\nTime to automate it once and benefit from it forever.\n\n**organize** is a command line, open-source alternative to apps like Hazel (macOS)\nor File Juggler (Windows).\n\n### People use this for:\n\n- Sorting and tagging pictures into various folder structures based on EXIF data\n- Sorting and renaming PDF invoices based on file content\n- Removing incomplete downloads from their ~/Downloads\n- Cleaning up their ~/Desktop from unused files\n- Freeing up disk space by removing duplicates\n- Automating various business processes\n- and many more\n\n## Features\n\nSome highlights include:\n\n- Safe moving, renaming, copying of files and folders with conflict resolution options.\n- Fast duplicate file detection.\n- Exif tags extraction.\n- Categorization via text extracted from PDF, DOCX and many more.\n- Powerful template engine.\n- Inline python and shell commands as filters and actions for maximum flexibility.\n- Everything can be simulated before touching your files.\n- Works on macOS, Windows and Linux.\n- Free and open source software.\n\n## Getting started\n\n### Installation\n\nOnly python 3.9+ is needed.\nInstall it via your package manager or from [python.org](https://python.org).\n\nInstallation is done via pip. Note that the package name is `organize-tool`:\n\n```bash\npip install -U organize-tool\n```\n\nThis command can also be used to update to the newest version. Now you can run `organize --help` to check if the installation was successful.\n\n### Create your first rule\n\nIn your shell, run `organize new` and then `organize edit` to edit the configuration:\n\n```yaml\nrules:\n  - name: \"Find PDFs\"\n    locations:\n      - ~/Downloads\n    subfolders: true\n    filters:\n      - extension: pdf\n    actions:\n      - echo: \"Found PDF!\"\n```\n\n\u003e If you have problems editing the configuration you can run `organize show --reveal` to reveal the configuration folder in your file manager. You can then edit the `config.yaml` in your favourite editor.\n\nsave your config file and run:\n\n```sh\norganize run\n```\n\nYou will see a list of all `.pdf` files you have in your downloads folder (+ subfolders).\nFor now we only show the text `Found PDF!` for each file, but this will change soon...\n(If it shows `Nothing to do` you simply don't have any pdfs in your downloads folder).\n\nRun `organize edit` again and add a `move`-action to your rule:\n\n```yml\nactions:\n  - echo: \"Found PDF!\"\n  - move: ~/Documents/PDFs/\n```\n\nNow run `organize sim` to see what would happen without touching your files.\n\nYou will see that your pdf-files would be moved over to your `Documents/PDFs` folder.\n\nCongratulations, you just automated your first task. You can now run `organize run`\nwhenever you like and all your pdfs are a bit more organized. It's that easy.\n\n\u003e There is so much more. You want to rename / copy files, run custom shell- or python scripts, match names with regular expressions or use placeholder variables? organize has you covered. Have a look at the advanced usage example below!\n\n## Example rules\n\nHere are some examples of simple organization and cleanup rules. Modify to your needs!\n\nMove all invoices, orders or purchase documents into your documents folder:\n\n```yaml\nrules:\n  - name: \"Sort my invoices and receipts\"\n    locations: ~/Downloads\n    subfolders: true\n    filters:\n      - extension: pdf\n      - name:\n          contains:\n            - Invoice\n            - Order\n            - Purchase\n          case_sensitive: false\n    actions:\n      - move: ~/Documents/Shopping/\n```\n\nRecursively delete all empty directories:\n\n```yaml\nrules:\n  - name: \"Recursively delete all empty directories\"\n    locations:\n      - path: ~/Downloads\n    targets: dirs\n    subfolders: true\n    filters:\n      - empty\n    actions:\n      - delete\n```\n\n\u003c!--\u003cdetails markdown=\"1\"\u003e\n  \u003csummary markdown=\"1\"\u003eAdvanced example\u003c/summary\u003e\n\nThis example shows some advanced features like placeholder variables, pluggable\nactions, limited recursion through subfolders and filesystems (FTP and ZIP):\n\nThis rule:\n\n- Searches recursively in your documents folder (three levels deep) and on a FTP server\n- for files with **pdf** or **docx** extension\n- that have a created timestamp\n- Asks for user confirmation for each file\n- Moves them according to their extensions and **created** timestamps:\n- `script.docx` will be moved to `~/Documents/DOCX/2018-01/script.docx`\n- `demo.pdf` will be moved to `~/Documents/PDF/2016-12/demo.pdf`\n- If this new is already taken, a counter is appended to the filename (\"rename_new\")\n- Creates a zip backup file on your desktop containing all files.\n\n```yaml\nrules:\n  - name: \"Download, cleanup and backup\"\n    locations:\n      - path: ~/Documents\n        max_depth: 3\n      - path: ftps://demo:demo@demo.wftpserver.com\n    filters:\n      - extension:\n          - pdf\n          - docx\n      - created\n    actions:\n      - confirm:\n          msg: \"Really continue?\"\n          default: true\n      - move:\n          dest: \"~/Documents/{extension.upper()}/{created.strftime('%Y-%m')}/\"\n          on_conflict: rename_new\n      - copy: \"zip:///Users/thomas/Desktop/backup.zip\"\n```\n\n\u003c/details\u003e--\u003e\n\nYou'll find many more examples in the \u003ca href=\"https://tfeldmann.github.io/organize\" target=\"_blank\"\u003efull documentation\u003c/a\u003e.\n\n## Command line interface\n\n```txt\norganize - The file management automation tool.\n\nUsage:\n  organize run   [options] [\u003cconfig\u003e]\n  organize sim   [options] [\u003cconfig\u003e]\n  organize new   [\u003cconfig\u003e]\n  organize edit  [\u003cconfig\u003e]\n  organize check [\u003cconfig\u003e]\n  organize debug [\u003cconfig\u003e]\n  organize show  [--path|--reveal] [\u003cconfig\u003e]\n  organize list\n  organize docs\n  organize --version\n  organize --help\n\nCommands:\n  run        Organize your files.\n  sim        Simulate organizing your files.\n  new        Creates a new config.\n  edit       Edit the config file with $EDITOR.\n  check      Check whether the config file is valid.\n  debug      Shows the raw config parsing steps.\n  show       Print the config to stdout.\n               Use --reveal to reveal the file in your file manager\n               Use --path to show the path to the file\n  list       Lists config files found in the default locations.\n  docs       Open the documentation.\n\nOptions:\n  \u003cconfig\u003e                        A config name or path to a config file\n  -W --working-dir \u003cdir\u003e          The working directory\n  -F --format (default|jsonl)     The output format [Default: default]\n  -T --tags \u003ctags\u003e                Tags to run (eg. \"initial,release\")\n  -S --skip-tags \u003ctags\u003e           Tags to skip\n  -h --help                       Show this help page.\n```\n\n## Other donation options:\n\nETH:\n\n```\n0x8924a060CD533699E230C5694EC95b26BC4168E7\n```\n\nBTC:\n\n```\n39vpniiZk8qqGB2xEqcDjtWxngFCCdWGjY\n```\n","funding_links":["https://github.com/sponsors/tfeldmann","https://ko-fi.com/tfeldmann","paypal.me/tfeldmann42"],"categories":["Python","File Organization","Windows \u0026 Programming","python3","File Management Tools"],"sub_categories":["Snippets Manager","Utils"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftfeldmann%2Forganize","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftfeldmann%2Forganize","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftfeldmann%2Forganize/lists"}