{"id":23399914,"url":"https://github.com/caleb9/camera-utility","last_synced_at":"2025-06-30T03:05:53.605Z","repository":{"id":168621866,"uuid":"206962536","full_name":"Caleb9/camera-utility","owner":"Caleb9","description":"Command line tool to copy photos and videos (e.g. from SD card) and rename them by date","archived":false,"fork":false,"pushed_at":"2024-01-18T09:40:27.000Z","size":203,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-26T18:07:37.338Z","etag":null,"topics":["camera","csharp","phone","photography","photos","sd-card","utilities"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Caleb9.png","metadata":{"files":{"readme":"README.md","changelog":null,"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},"funding":{"github":"caleb9"}},"created_at":"2019-09-07T12:06:05.000Z","updated_at":"2023-07-25T22:33:54.000Z","dependencies_parsed_at":"2024-01-18T11:00:55.042Z","dependency_job_id":null,"html_url":"https://github.com/Caleb9/camera-utility","commit_stats":null,"previous_names":["caleb9/camera-utility"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/Caleb9/camera-utility","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Caleb9%2Fcamera-utility","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Caleb9%2Fcamera-utility/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Caleb9%2Fcamera-utility/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Caleb9%2Fcamera-utility/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Caleb9","download_url":"https://codeload.github.com/Caleb9/camera-utility/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Caleb9%2Fcamera-utility/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262702325,"owners_count":23350641,"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":["camera","csharp","phone","photography","photos","sd-card","utilities"],"created_at":"2024-12-22T10:17:49.400Z","updated_at":"2025-06-30T03:05:53.579Z","avatar_url":"https://github.com/Caleb9.png","language":"C#","funding_links":["https://github.com/sponsors/caleb9"],"categories":[],"sub_categories":[],"readme":"# camera-utility\n\nCommand line tool to copy photos and videos (e.g. from SD card) and rename them by date.\n\n[![Build status](https://ci.appveyor.com/api/projects/status/bjyr7h0qwtcx1kby/branch/master?svg=true)](https://ci.appveyor.com/project/Caleb9/camera-utility/branch/master)\n\n## Why?\n\nI've been downloading photos from my Canon EOS (DSLR) camera using EOS Utility which puts pictures into directories by\ndate, e.g. like this\n\n```\n2009_02_19/\n├── IMG_0030.JPG\n├── IMG_0032.JPG\n├── IMG_0034.JPG\n├── IMG_0037.JPG\n├── IMG_0038.JPG\n```\n\nNote that file names are based on sequential number.\n\nSometimes, I was also downloading photos from my Android phone, which resulted in this:\n\n```\n├── IMG_20190105_120559.jpg\n├── IMG_20190105_120600.jpg\n└── IMG_20190105_211552.jpg\n```\n\nSo I wanted to have a tool which would copy those files in a unified way from both sources. I liked how EOS Utility\ndivided things into sub-directories by date, but I preferred Android's naming scheme, where each photo has the creation\ndate in its name.\n\nThis small program does just that. It finds all the photos and videos in the input directory, reads the creation date\nfrom EXIF metadata, and copies the file into a sub-directory derived from the date (this can be optionally disabled),\nrenaming it so that the name is also derived from the creation date.\n\nIn the output directory result looks something like this:\n\n```\n2019_01_05/\n├── IMG_20190105_120559870.jpg\n├── IMG_20190105_120600440.jpg\n└── IMG_20190105_211552800.jpg\n```\n\nThis differs slightly from Android's scheme, in that there are milliseconds also in the time portion of the name. This\nis to support DSLR's High-Speed Shooting mode, where more than one photo per second is taken.\n\n## Supported File Types\n\nCurrently camera-util finds files of following types:\n\n* JPG / JPEG (note that extension stays unaffected)\n* CR2 (Canon's raw format)\n* DNG (Android's raw format)\n* MP4 (Video)\n* MOV (Video)\n\n## How to Use\n\nThere are three sub-commands to use:\n\n* `copy` and `move`\n* `check`\n\n```\nUsage:                                                                      │\n  camera-utility [options] [command]                                        │\n                                                                            │\nOptions:                                                                    │\n  --version         Show version information                                │\n  -?, -h, --help    Show help and usage information                         │\n                                                                            │\nCommands:                                                                   │\n  copy, cp \u003csrc-path\u003e \u003cdst-dir\u003e    Copies suppported image and video files  │\n                                   to destination directory and renames     │\n                                   them by date recorded in EXIF metadata.  │\n  move, mv \u003csrc-path\u003e \u003cdst-dir\u003e    Moves suppported image and video files   │\n                                   to destination directory and renames     │\n                                   them by date recorded in EXIF metadata.  │\n  c, check \u003csrc-paths\u003e             Scans file or directory for supported    │\n                                   image and video files and checks if      │\n                                   EXIF metadata is present. [default: .]\n```\n\nBoth `copy` and `move` commands take the following options:\n\n```\nArguments:                                                                  │\n  \u003csrc-path\u003e    Path to a camera file (image or video) or a directory       │\n                containing camera files. When a directory is specified,     │\n                all sub-directories will be scanned as well.                │\n  \u003cdst-dir\u003e     Destination directory root path where files will be copied  │\n                or moved into auto-created sub-directories named after      │\n                file creation date (e.g. 2019_08_22/), unless               │\n                --skip-date-subdir option is present.                       │\n                                                                            │\nOptions:                                                                    │\n  -n, --dry-run         If present, no actual files will be transferred.    │\n                        The output will contain information about source    │\n                        and destination paths.                              │\n  -k, --keep-going      Try to continue operation when errors for           │\n                        individual files occur.                             │\n  --skip-date-subdir    Do not create date sub-directories in destination   │\n                        directory.                                          │\n  --overwrite           Transfer files even if they already exist in        │\n                        destination.\n```\n\nThe `\u003csrc-path\u003e` and `\u003cdst-dir\u003e` are the only required arguments. Remaining options can be added in any combination.\n\nBy default (when `--keep-going` is not used), the application will bail out on first error, e.g. if it cannot read\nfile's EXIF metadata\n(this can happen for pictures taken with old phone for example). It will also **not overwrite any existing files**,\nunless `--overwrite`\noption is used.\n\nWith `--keep-going`, there's a report printed by the end containing list of skipped files and those where metadata could\nnot be read.\n\nI'd recommend using the `check` command first to see if all the files have valid metadata.\n\nThe application is written in C# on .NET, I have successfully used in on Windows, Linux and macOS.\n\n### Examples\n\nFind all camera files in current directory and check if they contain necessary metadata to derive date-based name\nfor `copy` or `move`\ncommands:\n\n```\ncamera-utility check\n```\n\nCheck a specific directory:\n\n```\ncamera-utility check /source/directory/path\n```\n\nExecute a test run to see how files would be copied and renamed:\n\n```\ncamera-utility copy /source/directory/path /destination/path --dry-run --keep-going\n```\n\nMove files and ignore errors for files which don't contain metadata:\n\n```\ncamera-utility move /source/directory/path /destination/path --keep-going\n```\n\nCopy files directly into `/destination/path` without the date sub-directory:\n\n```\ncamera-utility copy /source/file.jpg /destination/path --skip-date-subdir\n```\n\netc.\n\n## Things to Do\n\n* List of multiple individual files as input (currently only a single file or entire directory is supported)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcaleb9%2Fcamera-utility","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcaleb9%2Fcamera-utility","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcaleb9%2Fcamera-utility/lists"}