How to find out which photos were made by my iPhone and which were sent via WhatsApp?
After a nice holiday I've often taken around 200 photos and 80% was made by myself, 10% was incoming WhatsApp pictures and 10% was some other pictures that ended up on my iPhone.
I don't even want the WhatsApp pictures automatically backed up by Carousel on my iPhone 6, but unfortunately there is no way to disable that.
Is there an easy way from my MacBook to filter out the pictures I made myself from the other pictures?
- Good picture: http://i.imgur.com/lucv1DD.png
- WhatsApp picture: http://i.imgur.com/GmPHn0Y.png
Solution 1:
This makes use of the Exif info stored within the JPEG image file, some of which is indexed by Spotlight, however see the Notes: section below.
Here is a simple sample bash script to preform an action on any JPEG image files found in the working directory that was taken on a iPhone.
Copy and paste the code below into a plan text file, without an extension, and from a Terminal, make it executable using chmod +x filename
where "filename" is the name you gave to the script file. Then place it in a directory that's in your $PATH
, e.g /usr/local/bin
, otherwise you'll have to provide the fully qualified pathname to the script file on the command line to execute it.
Now in a Terminal use the cd
command to change to the target directory containing the JPEG image files you want to act upon, this becomes the target working directory, and type the name you gave to the script, then press Enter. It will echo the name of each JPEG image file that was taken on an iPhone.
- Hint: To more easily navigate to the target working directory from within the Terminal, type
cd
followed by a space then drag and drop from Finder the target folder onto the Terminal window. This populates the fully qualified pathname for you and then you can just press Enter. You're now in the target working directory containing the JPEG image files.
Code:
#!/bin/bash
for f in *.jpg *.JPG; do
x="$(mdls "$f" | grep -o 'iPhone')"
if [[ ! -z "$x" ]]; then
echo "$f was taken on an iPhone."
fi
done
Now obviously you'll want it to do something other then just echo the name of a JPEG image file that was taken on an iPhone, so you'll have to add additional command(s) within the for ... done
loop.
In this example I want all JPEG image files that were taken on an iPhone to be moved into a directory name "iPhone" within the working directory. So I modified the script accordingly.
Edited Code:
#!/bin/bash
if [[ ! -d "iPhone" ]]; then
mkdir "iPhone"
fi
for f in *.jpg *.JPG; do
x="$(mdls "$f" | grep -o 'iPhone')"
if [[ ! -z "$x" ]]; then
echo "$f was taken on an iPhone."
mv -v "$f" "./iPhone/"
fi
done
In Summary:
In the first if ... fi
block [[ ! -d "iPhone" ]]
tests for the existence of the "iPhone" directory within the current working directory and if it doesn't already exist, it's created by the mkdir
command.
In the for ... done
loop it only looks at files with extensions .jpg
and .JPG
. (I have both on my system.)
The $x
variable will either be empty containing nothing ""
or "iPhone"
upon completion of the commands within the "$(...)"
command substitution.
The output of the mdls
command for the JPEG image file gets piped |
to the grep
command looking for iPhone
and because of the -o
option it's either going to be an empty string or the word "iPhone" that's returned, which becomes the content of the $x
variable.
Therefore in the second if ... fi
block [[ ! -z "$x" ]]
tests to see that the "$x"
variable is not an empty string and when it holds something, in this case being "iPhone", it's going to act upon that .jpg
or .JPG
file. In the case of $x
not being an empty string, as it can only contain nothing or "iPhone", it moves that file into the "iPhone" directory within the working directory.
Notes:
Having tested this in several locations on both internal and external storage medium I noticed that in some places the files were stored and that while they did actually contain the model of the camera that created them nonetheless it was not reflected in the output of the mdls
command as those locations were excluded from indexing by Spotlight. So using the, third-party supplied, exiftool
command insured reading the information directly from the file itself and not relying on indexed information (or lack of indexed information) that the mdls
command accesses.
So if you want to download and install ExifTool and use it, then change mdls
to exiftool
in the x="$(mdls "$f" | grep -o 'iPhone')"
line of the script so it would look like x="$(exiftool "$f" | grep -o 'iPhone')"
.
In comparison on the same JPEG image file the exiftool
command showed the values of 23 additional Tags that were not displayed by the mdls
command. This may provide additional info to programmatically make the decision how to absolutely differentiate the source of the files by adding additional code to the script that would use info in the additional Tags, if necessary.