Monday, May 6, 2024
 Popular · Latest · Hot · Upcoming
6
rated 0 times [  6] [ 0]  / answers: 1 / hits: 14888  / 2 Years ago, thu, february 3, 2022, 1:33:04

I often import photos and videos (mostly having JPG and MOV extensions) from digital cameras and tablets to my PC, and I would ideally like to see them sorted according to the dates and times they were taken already present in their EXIF data. And hence my wish to rename them all preferably using a simple Nautilus Script by preferably inserting the date and time stamps before each filename.



I have so far managed only to bring together the following Nautilus Script, which I believe is far from perfect:



for i in *.*
do
mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}')_"$i""
done


What I don't like in this renaming method is the colons used in EXIF date and time stamps (e.g. "2013:09:03 20:55:09_IMG_0108.JPG") which might create problems when transferring these files later to other environments (e.g. Windows).



This command (using exiv2 instead of exiftool) conveniently enables manipulation of date and time stamps but its drawback is that it doesn't work on video (e.g. MOV) files:



exiv2 -k -r '%Y-%m-%d_%H-%M-%S_:basename:' rename "$i"


So I'm hoping someone can come up with a better solution. And it would be magic if it even managed to convert the original filenames and extensions to lowercase as well!


More From » video

 Answers
5

What I don't like in this renaming method is the colons used in EXIF date and time stamps (e.g. "2013:09:03 20:55:09_IMG_0108.JPG") which might create problems when transferring these files later to other environments (e.g. Windows).




You could run the naming scheme through sed, to replace the colons with dashes and spaces with underscores, like so:



mv -i "$i" "$(exiftool -CreateDate "$i" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$i"


As for making the whole thing lowercase, you could use rename:



rename 's/(.*)/L$1/' file.JPG
## or
rename 's/(.*)/L$1/' *.*


Or you could do it within your script using sed, as in:



j=$(echo "$i" | sed -e 's/(.*)/L1/')


...and then use the $j variable in place of the final $i of your mv line. This sed way is slightly more portable (if that matters to you) as different linux distros have different rename commands, while sed is universal.



Or, alternatively, the script can be modified as follows to perform filename conversion to lowercase at the beginning using tr instead:



for arg 
do
tmp="$(echo "$arg" | tr '[A-Z]' '[a-z]')"
mv -i "$arg" "$(exiftool -CreateDate "$arg" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_$tmp"
done


To perform slightly different commands for different file types, a bash case statement can be used in this script. For example:



#! /usr/bin/env bash
for filename in ./*
do
tmp="$(echo "$filename" | tr '[A-Z]' '[a-z]')"
case "$filename" in
*.MOV|*.mov)
mv -i "$filename" "$(exiftool -a -s -CreateDate-tur "$filename" | awk -F ': ' '{print $2}' | sed -e 's/-[0-9][0-9]:00//g' -e 's/+[0-9][0-9]:00//g' -e 's/:/-/g' -e 's/ /_/g')_$tmp"
;;
*.JPG|*.jpg)
mv -i "$filename" "$(exiftool -a -s -CreateDate "$filename" | awk -F ': ' '{print $2}' | sed -e 's/:/-/g' -e 's/ /_/g')_"$tmp""
;;
*)
echo 'Not a *.jpg or a *.mov!'
;;
esac
done


In this example, renaming of MOV files that have CreateDate timestamps ANY NUMBER of hours AFTER OR BEFORE JPG files is adjusted by using another (-tur) EXIF data and removing that that time difference suffix, and it might be necessary to change -tur part according to the location set in the system.


[#29422] Friday, February 4, 2022, 2 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
antorchestr

Total Points: 92
Total Questions: 111
Total Answers: 120

Location: Jordan
Member since Wed, Jun 17, 2020
4 Years ago
antorchestr questions
;