Organizing photos by date with Go


As always, you need to compile the Go program, the source code of which can be found in the download section for this article [3], using the rule of three from Listing 4. The importer binary created by doing this will then include all dependencies fetched from GitHub and can be easily copied to and run on systems with a similar architecture.

Listing 4

Compiling the Go Program

01 $ go mod init importer
02 $ go mod tidy
03 $ go build importer.go cacher.go util.go

Pro Tip: Formatting

By the way, professionals advise never to delete images selectively on SD cards for cameras, but instead you should format the whole card right away once it becomes too full.

The reason for this radical approach: The reformatting process also immediately identifies the bad blocks on the card and replaces them with good ones. When photos are simply deleted after they have been archived, this important step is omitted. Sooner or later, you will find yourself with a defective card, tearing your hair out because your freshly taken wedding photos can no longer be read.

When formatting the SD card, the .uuid file also disappears from it; the importer creates a new one during the next archiving run. The names of the photos on the card are therefore processed in a separate namespace, and reused file names are not a problem.

Why bother with the UUID and subdirectories at all, when you could easily determine from the date the photo was taken whether or not it already exists in the archive? This is all about performance: The operating system can fish the name and path of a file out of the inode table in next to no time, while it would have to read the file contents in order to check the Exif headers with the date – and doing so is a couple of orders of magnitude slower.


  1. DCF:
  2. "Programming Snapshot: Rewriting a Photo Tagger in Go" by Mike Schilli, issue 264, November 2022, pp. 48-51
  3. Source code for this article: @IE

The Author

Mike Schilli works as a software engineer in the San Francisco Bay Area, California. Each month in his column, which has been running since 1997, he researches practical applications of various programming languages. If you email him at he will gladly answer any questions.

Buy this article as PDF

Express-Checkout as PDF
Price $2.95
(incl. VAT)

Buy Linux Magazine

Get it on Google Play

US / Canada

Get it on Google Play

UK / Australia

Related content

  • Treasure Hunt

    A geolocation guessing game based on the popular Wordle evaluates a player's guesses based on the distance from and direction to the target location. Mike Schilli turns this concept into a desktop game in Go using the photos from his private collection.

  • Wheat and Chaff

    If you want to keep only the good photos from your digital collection, you have to find and delete the fails. Mike Schilli writes a graphical application with Go and the Fyne framework to help you cull your photo library.

  • Digital Shoe Box

    In honor of the 25th anniversary of his Programming Snapshot column, Mike Schilli revisits an old problem and solves it with Go instead of Perl.

  • Wanderlust

    For running statistics on his recorded hiking trails, Mike Schilli turns to Go to extract the GPS data while relying on plotters and APIs for a bit of geoanalysis.

  • HTML5 Offline

    An offline cache in your browser and a bit of HTML5 acrobatics combine for interactive web applications that keep working even when the Internet connection breaks down.

comments powered by Disqus
Subscribe to our Linux Newsletters
Find Linux and Open Source Jobs
Subscribe to our ADMIN Newsletters

Support Our Work

Linux Magazine content is made possible with support from readers like you. Please consider contributing when you’ve found an article to be beneficial.

Learn More