View on GitHub

Photon

Simple command line program for organizing your digital photos and videos in folders

Download this project as a .zip file Download this project as a tar.gz file

Photon is a simple command line program for organizing digital photos and videos in folders, and putting all photos and videos from different cameras in one organized folder. It extracts date and time of photos and videos (from filename, or image attributes, or file modification time) and classifies them in folders.

You can specifiy how to organize photos using --pattern flag. By default, Photon uses {y}/{m} - {M}/{original_name} pattern.

Suppose that we have this directory structure:

new_photos/
├── 2014-12-17-224924.jpg
├── 2015-01-03-134015.jpg
├── 2015-01-03-134031.jpg
├── IMG 2014-10-24-211327.jpg
├── screenshots
│   ├── Screenshot from 2014-12-30 20:43:02.png
│   ├── Screenshot from 2014-12-30 20:46:25.png
│   └── Screenshot from 2015-01-07 12:33:24.png
└── VID 2014-10-24-211429.mp4

Using default pattern, the result is:

organized_photos/
├── 2014
│   ├── 10 - Oct
│   │   ├── IMG 2014-10-24-211327.jpg
│   │   ├── VID 2014-10-24-211429.mp4
│   │   └── VID 2014-10-24-211429 PHOTON-VIDEO-PLACEHOLDER.jpg
│   └── 12 - Dec
│       ├── 2014-12-17-224924.jpg
│       ├── Screenshot from 2014-12-30 20:43:02.png
│       └── Screenshot from 2014-12-30 20:46:25.png
└── 2015
    └── 01 - Jan
        ├── 2015-01-03-134015.jpg
        ├── 2015-01-03-134031.jpg
        └── Screenshot from 2015-01-07 12:33:24.png

Using {y}/{m}/{d}/{h}:{mi}:{s} pattern we have:

organized_photos/
├── 2014
│   ├── 10
│   │   └── 24
│   │       ├── 21:13:27.jpg
│   │       ├── 21:14:29.mp4
│   │       └── 21:14:29 PHOTON-VIDEO-PLACEHOLDER.jpg
│   └── 12
│       ├── 17
│       │   └── 22:49:24.jpg
│       └── 30
│           ├── 20:43:02.png
│           └── 20:46:25.png
└── 2015
    └── 01
        ├── 03
        │   ├── 13:40:15.jpg
        │   └── 13:40:31.jpg
        └── 07
            └── 12:33:24.png

And so many other patterns are possible. You can use {y}, {m}, {M}, {d}, {h}, {mi}, {s}, {original_name} in pattern.

Description Example
{y} Year 2015
{m} Month 12
{M} Month Dec
{d} Day 31
{h} Hours 23
{mi} Minutes 59
{s} Seconds 59
{original_name} Original File Name IMG 2014-10-24-211327

Installation

Photon needs Pillow Python library. After installing Pillow, add following line to your ~/.bashrc file.

alias photon="python3 PATH/TO/photon"

Getting Started

IMPORTANT NOTE

If you are not sure about what will happen after running
the command, first use --dry-run flag, and if everything
was ok, then run the command without --dry-run.

Suppose your directory structure is like this (organized_photos is the directory containing your old photos organized by Photon.)

.
├─ organized_photos
├─ new_photos
└─ ...

For adding new photos (photos in new_photos folder) to your organized photos, run:

photon cp new_photos organized_photos

The above command recursively copies files from new_photos to organized_photos. If you want to recursively move files instead of copying, run:

photon mv new_photos organized_photos

Above commands use the default pattern for file paths ({y}/{m} - {M}/{original_name}). You can use any pattern you wish. e.g. {y}/{M}/{y}-{m}-{d} {h}:{mi}:{s}. Note that this pattern renames file names to {y}-{m}-{d} {h}:{mi}:{s}. I, personally use this command:

photon mv new_photos organized_photos --jalali --chars fa --pattern "{y}/{m} - {M}/{y}-{m}-{d} {h}:{mi}:{s}"

Usage

usage: photon [-h] [--jalali] [--chars {fa,en}] [--dry-run] [--pattern [PATTERN]]
              CMD TARGET ORG_DIR

positional arguments:
  CMD                  {mv,cp}
                       mv: move files to ORG_DIR
                       cp: copy files to ORG_DIR
  TARGET               file or folder to be organized
  ORG_DIR              folder to save organized files

optional arguments:
  -h, --help           show this help message and exit
  --jalali             convert dates to Persian (use Persian dates in organized file names)
  --chars {fa,en}      use Fa/En characters for digits in file names (default: en)
  --dry-run            do not copy or move files. just print what will happen
  --pattern [PATTERN]  use PATTERN for file paths
                       default: "{y}/{m} - {M}/{original_name}"
                       example: "{y}/{m} - {M}/{y}-{m}-{d} {h}:{mi}:{s}"

Want to contribute?

Feel free to fork Photon and start contributing.

License

Photon is licensed under GNU GPLv3.