Files
Lee Hanken 7c8efd2228 Initial commit: HPR Knowledge Base MCP Server
- MCP server with stdio transport for local use
- Search episodes, transcripts, hosts, and series
- 4,511 episodes with metadata and transcripts
- Data loader with in-memory JSON storage

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-26 10:54:13 +00:00

285 lines
25 KiB
Plaintext

Episode: 1791
Title: HPR1791: Organizing Photos with Bash
Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr1791/hpr1791.mp3
Transcribed: 2025-10-18 09:22:15
---
This is HPR episode 1,791 entitled Organizing Photos with Bash and in part on the series
Bash Cripting.
It is posted by Tony Pelin and in about 31 minutes long, the summary is you smash to simplify
the process of Organizing and backing up photographing.
This episode of HPR is brought to you by an honesthost.com.
At 15% discount on all shared hosting with the offer code HPR15, that's HPR15.
Better web hosting that's honest and fair at An Honesthost.com.
Hi, my name is Tony Pelinis and this is my second episode for Hacker Public Radio.
Today I wanted to talk to you about what I use to import my photographs, get them off
of my camera and onto my computer and how I organize them.
I'm not a professional photographer but I do like to take a lot of pictures.
Looking back through my folders, I have probably taken an average around 3 to 4,000 pictures
a year and it becomes or it can become quite overwhelming to manage.
I often have very little time and so I sit out for a solution that allow me to organize
my pictures quickly, make sure that they're backed up in case something happens to my computer
and that I'll be able to enjoy them for many years to come.
As a Linux user, I have a lot of options available to me in terms of photograph software
that I can use to manage my library.
There's DigiCam which I like a lot, shot well amongst others but what I found most effective
at least for me is to write my own scripts to manage my programs.
I still use software to edit them, to manipulate the images and ultimately to create something
that I can print but to organize my files, make sure that they're backed up regularly, etc.
I find that the best solution is to write my own scripts.
Today I'm going to talk about a script I wrote and hopefully you'll get an idea of what you can
do yourself or you can use my script as a starting point to customize something for your own personal
photographic management needs. The script I wrote will be available in the show notes
and it's also up on GitHub as a gist so if you like what you hear about you don't have to remember
everything but you can go on the show notes and see find the actual script and I also would like
to ask you if you know anything about bash scripting and you think you could improve my script
please feel free to send me a pull request or bank any suggestions because really although I
do know how to write bash scripts I'm certainly no expert and I'm sure there are plenty of people
out there that are much smarter and much better at this than me. Okay so before we take a look at
the script line by line I wanted to give you a high level overview of what the purpose of the script
and how I use it in my everyday workflow to organize my pictures so the most important thing
for me in this particular script is to be able to take images from a multitude of sources
and put them all in a single location and organize them into folders that are structured by the
date that the picture was taken specifically I want them in a folder by the year and then in a subfolder
by the specific date because that makes it very easy for me to go back sometime in the future and
be able to find pictures which were taken on a specific day without the need to have any special
software to look at the meta information on these images in order to identify a specific time
range and because I take a lot of pictures you know I'm using several different
cameras I have a digital SLR I have a little point in shoot I have my cell phone camera so it needs
to be able to interface with all these different devices including other pictures that are
synced to my computer through cloud services such as Dropbox and put them all in a single location
make sure that you know the file names are do not conflict and that I don't delete any
images that maybe duplicates or that I don't create any images that maybe duplicates
and the second thing that I want to do also is make sure that these pictures are backed up
so I use a couple of different services I back them up to Google plus because Google plus offers
a lot of nice features for photographers in terms of being able to share the images and also
it provides for an unlimited number of free uploads if the images are underneath a certain files
or dimension size now I know Google plus is not open source it's not accessible friendly
but these features or more specifically the price and the features are something that
I like even though it's not my primary source of saving these backup images I have also recently
added to the script another destination to back of my photographs and that's using dream hosts
dream objects which is a Amazon S3 compatible object storage and what I like about it basically
is that it's less expensive than Amazon at least to upload in store files for long-term backup
now one thing that I worry about because I live in California is that some sort of natural
disaster or earthquake will completely destroy my house and all the electronics that I have inside
and that the pictures that I've taken for years dating back now to 2005 will be completely destroyed
and lost to me forever now a lot of these pictures really are irreplaceable to me I have a lot of
family you know my kids growing up things that I would never be able to go back in time and take so
I want to make sure that I take all the appropriate precautions to make sure this information is
backed up securely or at least in a way where I feel more confident that it would be able to
withstand the event of some sort of catastrophe affecting my computer now in order to back up
these images I also want to create thumbnails of all the pictures that I take because some of my
cameras have large CCDs take 16 megapixel images which end up being quite large in the file size
so when I upload them to Google plus or something I don't really need them
at those huge dimensions so I want to create thumbnails which allow me to resize the pictures into a size
that Google plus allows me to store them for free now the disadvantage of reducing the size of
an image and backing those up is that in the future who knows what will be the standard screen
resolution we may end up finding out that an image that's a thousand pixels by a thousand pixels
will look extremely tiny in the monitors of the future and to be most the most future proof it's
always best to back up the original files but of course the original files of their larger in
resolution larger in file size it ends up being more expensive to back them up but I've come to a
point where I'm okay with paying the extra price to use something like Amazon S3 or DreamHouse
DreamObjects to store this information because the pictures that I've taken have a value to me
and I want to make sure that they are backed up safely and that I have the original files if I
ever want to go back and edit them or print them or share them in the future now if I look back
I've been taking digital photographs since around 2005 or so actually you know I did have a small camera
that allowed me to take digital photographs a few years before that but I look back at those and
the quality was so poor the image and size was so small that it's almost it's really difficult
to look at some of those pictures because they're very pixelated blurry and small and size now
I first learned to or I first really got into photography when I was in high school so be around
the mid-90s and back then we used film cameras and of course one of the picked disadvantages of film
is that it's relatively expensive back in those days you could get a role of film of which would
only take 24 pictures and you spend a day taking those 24 pictures you have to make sure that you're
metering the light and that you're everything is in focus and then you spend some extra money to
develop the film and then you wait maybe a week or so unless you go to one of those one hour photo
places and you get your pictures back and you realize half of them are out of focus or the
metering wasn't correct so they're dark or too light and you know one one of the really nice things
about digital photography is that we can look at the picture right away we can tell whether
it's out of focus and if it is or if the lighting is not right we can take the picture right
take a new picture again of course the disadvantage of that is now it's become incredibly easy to
take thousands of pictures and it's of course a lot more to manage for someone who's not a
professional like myself so hopefully again this script will help you and address some of those
as it has helped me so without further ado let's go through the script line by line and I
hope to explain to you what it does okay the first thing you'll want to do is download the script
and like I said before I will include a link in the show notes once you have the script downloaded
you can just run it the script itself is just a single file called import-photos.sh so
if you make sure set that to executable and then open up a terminal because this is a
bash script so you'll have to use it from the command line navigate to wherever you save the file
and type in the name of the file name which is import-photos.sh this particular script also
accepts arguments and before to get a summary of the arguments that this script takes just type
in the name of the file then space then dash then h and you will get the little help
some help text it shows the dependencies for this particular script which are gphoto2
dc raw google cl rsync and s3 cmd so if you don't have those particular applications already
on your computer you'll have to install them now you can still use the script
if you're missing some of them such as google cl or s3 cmd or gphoto2
or dc raw depending on whether or not your camera takes raw images but I highly recommend that
you install all these programs to use the script to its full functionality now the different
options that you have are the first one is dash dash destination dash directory and that particular
argument accepts a location where you're ultimately going to copy these images to for me it's an
external hard drive that I connect and I mount through media dash tier and the second argument
that this script can take is a dash dash tmp dash dir and that accepts a location of where you
want to store your or temporarily save the files because it does do processing to the images it
needs a temporary directory the default would be slash temp for me I use a slash slash temp directory
that is in memory so that to make a quick but the disadvantage of having something in memory is
that I can run out of RAM so if I have a lot of pictures multiple gigabytes potentially
a may run out of RAM so I'll have to set a new temp directory to some location
the third option I have available is a dash dash no dash google dash backup if you don't want to
backup your photographs to google plus you can give it this command line option and it will
I'll skip that part the next option I have is dash dash sd dash card and that accepts a location
of where you may have an sd card from which you want to import images now doesn't necessarily have
to be an sd card it can just be any folder you can point it to any folder on your computer and it
will process the that that folder of images so I use that with pictures that are synced from my
phone through Dropbox to my computer and I'll run the script on that folder and it will
organize them into folders by date etc and upload them into google plus and whatnot the next
option is a dash dash no dash delete the script cleans up after itself after runs and it will
delete the temporary directory that it creates if you run this option it will keep the temporary
directory in case you wanted to do any post processing to those files after you run the script
and finally the last option that I have available is a dash dash backup which accepts a folder name
and an s3 bucket and this is for backing up your photographs to an s3 compatible service like I
said Amazon s3 is the the Amazon is a company that created s3 and they have a specific
API but there are other services available that have a similar API which you could use the
program s3 cmd4 to sync the files now I use this infrequently I will only backup maybe once a
year so I'll I have a whole folder of pictures that I've taken that year and then after the years
over I'll back it up into Amazon s3 so this is not something that you necessarily need to do
every day so let me go back to the dependencies and talk a little bit about how each one of these
programs is used so the first dependency is gphoto2 gphoto2 is what the program that is used to
interface with your camera directly in order to download the photographs and it's compatible with
quite a number of models of cameras now I did have a problem with one of my point in shoes in
running Ubuntu and that it was causing some problems at one point but I was able to fix it by
simply updating gphoto2 and also dcraw so if you're having any issues with either one of those
programs I highly recommend that you seek out the latest version of those and download it and install
it onto your computer the second dependency is dcraw that's to convert raw images raw
many of the new cameras take what's called a raw image which is basically a capture of all the
information that the ccd can get now in order to display an image and the image that's displayed
cannot necessarily or may not be able to show the entire dynamic range of the information that's
captured and so the camera by default selects a what it believes to be the the best
way to display an image but that's not always the best way and so a lot of photography these days
I just like to use the raw format because it it allows a greater flexibility in ultimately
editing the final picture that gets printed or displayed online now the raw format the issue
with the raw format is that every camera manufacturer basically has their own
format so the script because I have to Nikon cameras that shoot raw images
specifically looks for those file extensions and if you shoot Canon or Olympus or some other
you have some other camera you may have to edit the script a little to get it to work now the
cameras that I use are Nikons they both shoot raw images because of that my script is really tailored
to use the Nikon raw image file format if you have a different camera let's say a Canon Olympus
Sony whatever it may be you may have to change the script a little to use the raw file formats
that your particular camera creates now using DC raw it should be a pretty simple matter of just
changing the file extension that the script looks for but because I those are the only two cameras
that I have that's all I've been able to test it with so if you have any trouble let me know
and I'll see maybe I can help you out the next dependency is Google CL Google CL is a command line
utility that interfaces with various Google services and the one that I use use it for
used to be called Picasso and now has been integrated into Google Plus and essentially what it does
is take all the images that I have and upload it into my Google Plus account now you'll have to
supply it with your Google account information so the first time you run it's going to ask for
you to authenticate through your web browser and give it your email address and password and
after that initial setup it will remember that information so what I recommend if you're going to
use that particular feature of this script is to run the Google CL independently make sure that
it's registered with your Google account that you authorize it to access your your services and then
run the script because it may prevent it from working correctly if it can't get access to your
account information the next one of course is our sync our sync is the utility which will sync
the images that are organized in their folders to wherever the ultimate destination where
you're going to put them and I find our sync to be very useful because I make sure that I don't
or that I if if I have any newer pictures that it only copies the new pictures and not the old
pictures and the last one is s3 cmd which is a command line utility to interface with s3
like services and that's what I use to back up my files to the dream host cloud objects I believe
it's called I'm sorry dream objects service okay with that out of the way let's open up the
actual script in our favorite text editor I prefer emax so I'm looking at it right now using emax
and the very top of the script you'll find a number of variables some of which you may want to
change so let me go over those the that you'll there is a environment variable that is declared
called temp deer and that is the default temp location like I said it creates a folder in the
slash temp directory called photos and if that's not your preferred location you can always change that
it doesn't have to be in the temp directory it could be anywhere on your computer just set that
to somewhere where you'd want it to store these files that it's processing at the end of the
process unless unless you select the node delete option it deletes this folder so it doesn't really
matter the most important thing to keep in mind is that you have a set a location that is large
enough to store all your information and like we went over before and with some of the command line
command line options that are available to you to the script you can change it at the moment that
you run it the next one that you want to take a look at is called destination currently it's set
to slash media slash tiers slash pictures slash photos that's where I store my pictures that's
the destination that I want them to go to you'll have to change that to yours because more than
likely you won't have the same folder structure on your computer that I have in mind and then after
that you'll see the Google user that's my email address you'll want to change that to your own
email address if you're going to use these Google services a couple of defaults are set as well
Google backup is set to true and by default you can set that to false if you don't want it to run
every time SD is set to false which is the the card or folder that you want to backup images from
and no delete is set to false to s3 backup is also set to false next part of my script looks at
all the dependencies and creates variables that are the same name as the application so you'll
there's several applications that are users find gphoto2 google dc raw are seeing renamed
s3 cmd all those are created as variables in this particular script then I go through those
variables and do the sanity checks make sure all the applications are installed if it's not
installed on your computer you'll receive an error when running this particular script to notify
you to go to go ahead and use your package manager to install them and skipping down a little
farther you'll see the help text that we already went through and you'll see the part of the code
that goes through different command line options and try to identify which ones you had picked now
if there are any bash scripters out there that could offer me some assistance I've had some bugs in
the script that I can't quite figure out and that is sometimes it matters sometimes the order in
which you pass these command line arguments matters and I'd like to find some sort of way to be able to
make that less important or more robust so that it would the script would work no matter what order I
put these command line arguments I find I find that it's usually an issue when I'm mixing command line
arguments that accept an argument with those that do not but again if any any bash scripters out
there it could help me out I'd really appreciate it a little farther down in the script is where
I define the functions that I use the first function I have defined is one called convert to JPEG
which takes a folder of images and goes through all the files in those folders and uses as the DC
RAW program to convert the RAW files to JPEGs later on in the script I'll use these JPEGs to
resize them and upload them to Google Plus because Google Plus will not display RAW images so they
need to be converted into JPEGs first then the next function I have is one called resize to thumb
and that will take those JPEG images and resize them to a size of no more than 2048 pixels by 2048
pixels in my research this is this was or is the largest file size that Google Plus will accept
without charging extra after that there is a function called import photos and that uses the
G photo to program to import pictures off of the camera that I have connected now more recently
I've stopped using that method I don't no longer connect my camera directly to my computer because
I purchased an SD card reader and I prefer to use that instead so I haven't tested that in a while
hopefully it still works okay and hopefully it's not too dependent on my particular models of
camera but using an SD card reader I've found to be a lot faster and it doesn't drain my camera
battery so it's really my preferred method of importing my pictures the function after that is
one called remove spaces and that's really to make the naming of these files a little more
consistent because you know some cameras or some user default defaults may add spaces to the
files which will more make it makes it a little more complicated to deal with in the script so
I just decided let's take them all out then the function after that is to sort images that will
put them in the folder structure that ultimately I want to copy over which like I said before
a structure of a folder named after the year the picture was taken in and then a subfolder named
after the specific date in which the picture was taken and the last function that I have is
to create the s3 backup and it's called archive folder takes a folder of images
converts it into a or compresses it into a tar dot bz2 file and then uses the s3 cmd to
upload it into the s3 bucket that's already been created if you're not familiar with s3
i or the 8th s3 api it would be worth maybe another hpri episode to go over that process
but you do have to create a bucket before you use the script to upload it
moving down a little farther is the actual script part these this is the part that actually
runs and does all the work the first thing that it does is create the temp directory and moves
into the temp directory and then it checks to see whether or not I want to make a s3 backup and I
put that right there because I wanted to exit the script if all I want to do is do the s3 backup
like I said usually I don't do the s3 backup at the same time that I'm importing my pictures
so if if I do decide to do the s3 backup I wanted to exit before it goes through the process of
doing the rest of the script then I moving down a little further is what the normal work process
would be for the script which is to import the photos remove the spaces from the files
convert all the files to lowercase just to make the naming consistent sort them into the structure
that I want them to be in which is again that folder named after the year then a subfolder named
after the specific date and then create the jpegs which which will be uploaded into the google plus
now if you look and this particular section you'll see that it's using the convert to jpeg
function that I talked about earlier and it's converting all the files that are in the dot
nef and dot nrw file format now if you have a camera that's not an icon or if you have a
icon that uses a different raw format you'll have to change this particular file extension
and so it will convert all these files these raw pictures into jpegs and then resize them
into a thumbnail size then it checks if you want to upload them to google plus and if you do
it will upload them into your username into your google account in a folder called backup and the
date of the that the script was run excuse me so it uploads in to your user account to google plus
in a folder which you'll find under photos called backup and the date that this particular script
was run and then almost the last thing is to our sync the temp directory that we've sorted all the
pictures to to the ultimate destination where we're going to keep these pictures for hopefully forever
and then it does a little bit cleanup by removing the temp directory and exiting so let's say
quick overview of my script I hope you enjoyed this episode I look forward to receiving any feedback
and if you have a better way to manage your pictures or I would say a more hacker public radio
way to manage your pictures please create an episode I really find it a pleasure to listen to
so that'll do it for me again my name is Tony Polias feel free to reach out to me if you have any
questions or would like help getting this script started on your computer thanks a lot bye bye
you've been listening to hacker public radio at hackerpublicradio.org we are a community podcast
network that releases shows every weekday Monday through Friday today's show like all our shows
was contributed by an hbr listener like yourself if you ever thought of recording a podcast
then click on our contributing to find out how easy it really is
hacker public radio was founded by the digital dog pound and the infonomicon computer club
and it's part of the binary revolution at binrev.com if you have comments on today's show
please email the host directly leave a comment on the website or record a follow up episode yourself
unless otherwise stated today's show is released on the creative comments
attribution share a light 3.0 license