Episode Details
Back to EpisodesHPR4697: Correcting the Dates of Files
Description
This show has been flagged as Clean by the host.
I recently had an experience where UNIX tools proved very useful. A relative had an old mobile phone running Android that stopped connecting to the carrier's network and bought a new one to replace it. I took on the job of trying to copy their files (consisting of just photos and videos) off of the old phone.
Google's software was desperate to convince me to upload everything to the cloud, but I wasn't interested. It offered the option of copying the files over to an SD card, but failed on repeated attempts to do that. The option I tried next was to transfer them to another device via Bluetooth—that one did actually work, although it was slow and would only handle sending about 100 files at a time.
They came over to my laptop OK, but the problem with that method was that all of the file times were set to the time when they were transferred. I'm not super familiar with how mobile apps manage metadata, but would presume that they look to file times for organizing photos by date. Fortunately, the names of each of the files included the date and time they were created. I recognized that I could write a bit of shell script to parse the filenames and set the file times accordingly.
While there were over 800 files, the good news is that there were only three different categories of filenames, so the logic to extract the information needed was relatively simple. Each file had eight numerical digits representing the date and six digits representing the time. It would definitely be an option to come up with a more sophisticated parser that could handle a wide variety of filenames, but I went the lazy way and just handled those three cases. Another nice aspect was that none of the filenames contained spaces, which allowed me to be a bit less careful when using them in command lines. I didn't need to worry about time zones because my laptop was set to the same time zone as the phone—also, if a time was off a by a few hours it wouldn't make a practical difference.
Examples of the three different types of filenames I had to deal with, labeled with the relevant values: YYYY=year, MM=month, DD=day, hh=hour, mm=minute, and SS=second.
00001IMG_00001_BURST20250525140124.jpg
YYYYMMDDhhmmSS
IMG_20220223_124023.jpg
VID_20221017_095024.mp4
YYYYMMDD hhmmSS
20191224_195939.jpg
20161021_122620-1.jpg
20191130_134317_Burst01.jpg
20200129_223612_010.jpg
YYYYMMDD hhmmSS
I considered
awk
as an option (see
Whiskeyjack's comment on HPR episode 4657
), but realized it has no built-in way to change file times, so I set it aside. Don't worry, I
will
come back to that later.
My approach was to use an
if-then
shell construct to choose how to treat the three categories of filenames. For the
if
condition, I fed the filename into the
grep -q
command with an appropriate regular expression to test whether it matches. The
-q
option to
grep
causes it not to output anything—it returns a zero exit status if there's a match and a status greater than zero if there isn't. Then, there is an
elif
statement with another
grep -q
test for the second category of filenames. Finally, an
else
statement is followed by the command to run for all other filenames. The whole thing is wrapped in a
for
loop that runs over all the files in the current directory.
Listen Now
Love PodBriefly?
If you like Podbriefly.com, please consider donating to support the ongoing development.
Support Us