1.1.1 • Published 4 years ago

photo-ingress v1.1.1

Weekly downloads
1
License
GPLv3
Repository
-
Last release
4 years ago

photo-ingress

A small script to copy all files (jpg,jpeg) found within an input folder (recursively) to an output folder organized by year/month/day, detecting duplicates by comparing the exif tags "CreateDate", "ImageWidth", "ImageHeight" Example:

srcFolder/foo/bar/img.jpg -> targetFolder/2020/05/18/img.jpg

Installation

npm install -g photo-ingress

Usage

photo-ingress srcFolder/ targetFolder # this will simulate

photo-ingress srcFolder/ targetFolder --copy # this will copy files not existing yet in the target 

Notes:

  • If there is no exif flag "DateCreated" the date 1970-1-1 is used.

Examples

General usage

First print the help text:

mrbook:panos paul$ photo-ingress
Usage: photo-ingress inputPath outputPath [--copy] [--printCollisions] [--printCopied] [--printExisting]
No options means simulation, i.e. only if --copy is provided files are written.

Let's see what would happen (the ~> indicates files that would be copied):

mrbook:panos paul$ photo-ingress ./ ~/media/photo-lib/ --printCopied --printExisting
PANO_20180118_211832.jpg ~> /Users/paul/media/photo-lib/2018/01/18/PANO_20180118_211832.jpg
PANO_20180119_153524.jpg ~> /Users/paul/media/photo-lib/2018/01/19/PANO_20180119_153524.jpg
PANO_20180121_120213.jpg ~> /Users/paul/media/photo-lib/2018/01/21/PANO_20180121_120213.jpg
[...]
PANO_20190718_235005.jpg ~> /Users/paul/media/photo-lib/1970/1/1/PANO_20190718_235005.jpg
PANO_20190718_235016.jpg ~> /Users/paul/media/photo-lib/1970/1/1/PANO_20190718_235016.jpg
PANO_20190718_235055.jpg ~> /Users/paul/media/photo-lib/1970/1/1/PANO_20190718_235055.jpg
[████████████████████████████████████████] Total  | 100% | 75/75
[░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] Copied | 0% | 0/75
[░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] Exist  | 0% | 0/75
[░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] Collisions | 0% | 0/75
Total: 75
Would copy: 75
Existing: 0
Collisions: 0

Now, we want to copy the files, by adding --copy (The => files that have been copied):

mrbook:panos paul$ photo-ingress ./ ~/media/photo-lib/ --printCopied --printExisting --copy
PANO_20180118_211832.jpg => /Users/paul/media/photo-lib/2018/01/18/PANO_20180118_211832.jpg
PANO_20180119_153524.jpg => /Users/paul/media/photo-lib/2018/01/19/PANO_20180119_153524.jpg
PANO_20180121_120213.jpg => /Users/paul/media/photo-lib/2018/01/21/PANO_20180121_120213.jpg
[...]
PANO_20190718_235005.jpg => /Users/paul/media/photo-lib/1970/1/1/PANO_20190718_235005.jpg
PANO_20190718_235016.jpg => /Users/paul/media/photo-lib/1970/1/1/PANO_20190718_235016.jpg
PANO_20190718_235055.jpg => /Users/paul/media/photo-lib/1970/1/1/PANO_20190718_235055.jpg
[████████████████████████████████████████] Total  | 100% | 75/75
[████████████████████████████████████████] Copied | 100% | 75/75
[░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] Exist  | 0% | 0/75
[░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] Collisions | 0% | 0/75
Total: 75
Copied: 75
Existing: 0
Collisions: 0

Now, we try the same. The == indicates existing files:

mrbook:panos paul$ photo-ingress ./ ~/media/photo-lib/ --printCopied --printExisting --copy
PANO_20180118_211832.jpg == /Users/paul/media/photo-lib/2018/01/18/PANO_20180118_211832.jpg
PANO_20180119_153524.jpg == /Users/paul/media/photo-lib/2018/01/19/PANO_20180119_153524.jpg
PANO_20180121_120213.jpg == /Users/paul/media/photo-lib/2018/01/21/PANO_20180121_120213.jpg
[...]
PANO_20190714_191415.jpg == /Users/paul/media/photo-lib/1970/1/1/PANO_20190714_191415.jpg
PANO_20190718_234945.jpg == /Users/paul/media/photo-lib/1970/1/1/PANO_20190718_234945.jpg
PANO_20190718_235005.jpg == /Users/paul/media/photo-lib/1970/1/1/PANO_20190718_235005.jpg
[████████████████████████████████████████] Total  | 100% | 75/75
[░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] Copied | 0% | 0/75
[████████████████████████████████████████] Exist  | 100% | 75/75
[░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] Collisions | 0% | 0/75
Total: 75
Copied: 0
Existing: 75
Collisions: 0

md5 comparison

Comparing without --md5, i.e. by comparing exif meta data, is faster, but theoretically not correct:

mrbook:broken-image-import paul$ time photo-ingress ./ ~/media/photo-lib/
Using exif comparison (hint: --md5)
[████████████████████████████████████████] Total  | 100% | 2499/2499
[░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] Copied | 0% | 0/2499
[████████████████████████████████████████] Exist  | 100% | 2499/2499
[░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] Collisions | 0% | 0/2499
Total: 2499
Would copy: 0
Existing: 2499
Collisions: 0

real	0m12.855s
user	0m4.638s
sys	0m18.228s

Comparing with --md5 is slower (but guarantees files are identical):

mrbook:broken-image-import paul$ time photo-ingress ./ ~/media/photo-lib/ --md5
Using md5 comparison
[████████████████████████████████████████] Total  | 100% | 2499/2499
[░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] Copied | 0% | 0/2499
[████████████████████████████████████████] Exist  | 100% | 2499/2499
[░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] Collisions | 0% | 0/2499
Total: 2499
Would copy: 0
Existing: 2499
Collisions: 0

real	0m42.457s
user	0m42.584s
sys	0m15.396s