3

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?

0

1 Answer 1

4

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.

3
  • Wouldn't this also wrap up pictures which were sent via WhatsApp since those pictures should (theoretically) retain their EXIF data? For example, if I had a friend who sent me a photo and they had taken the picture on an iPhone, would that EXIF data no longer be present or wouldn't it be swept up into your script as well?
    – smoooosher
    Jul 29, 2015 at 23:00
  • @smoooosher, Theoretically yes JPEG files coming from WhatsApp could contain "iPhone" that grep looked for however, looking at the images linked in the OP the one from WhatsApp isn't showing that information. That of course doesn't mean it doesn't exist however the purpose of the script it to show a way of acting upon given files base on a variable and it can be coded to check other info that could stop a false positive in this case. This is where I'd use exiftool to get a cross section of info from several files known to each source to see what can delineate against a false positive. Jul 29, 2015 at 23:13
  • @smoooosher, As an example, it's my understanding the WhatsApp does not send a exact copy of the original image file, it also compresses it and may even remove some of the original Exif info in doing so. I don't have WhatsApp installed to play/test with. So the script could be further coded to also look a file size or maybe files being sent by WhatsApp are being tagged with the string e.g. "WhatsApp" and it's not indexed by Spotlight. Another good reason to use exiftool over mdls. Jul 29, 2015 at 23:42

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .