¿Cómo saber qué fotos fueron hechas por mi iPhone y cuáles fueron enviadas por WhatsApp?

Después de unas buenas vacaciones, a menudo tomé alrededor de 200 fotos y el 80 % las hice yo mismo, el 10 % fueron imágenes entrantes de WhatsApp y el 10 % fueron algunas otras imágenes que terminaron en mi iPhone.

Ni siquiera quiero que Carousel haga una copia de seguridad automática de las imágenes de WhatsApp en mi iPhone 6, pero lamentablemente no hay forma de desactivarlo.

¿Existe una manera fácil desde mi MacBook de filtrar las imágenes que hice yo mismo de las otras imágenes?

Respuestas (1)

Esto hace uso de la información Exif almacenada en el archivo de imagen JPEG, parte de la cual está indexada por Spotlight; sin embargo, consulte la sección Notas: a continuación.

Aquí hay una secuencia de comandos bash de muestra simple para realizar una acción en cualquier archivo de imagen JPEG que se encuentre en el directorio de trabajo que se tomó en un iPhone.

Copie y pegue el código a continuación en un archivo de texto del plan, sin extensión, y desde una Terminal, hágalo ejecutable usando chmod +x filenamedonde " nombre de archivo " es el nombre que le dio al archivo de script. Luego colóquelo en un directorio que esté en su $PATH, por ejemplo /usr/local/bin, de lo contrario tendrá que proporcionar el nombre de ruta completamente calificado al archivo de script en la línea de comando para ejecutarlo.

Ahora, en una Terminal, use el cdcomando para cambiar al directorio de destino que contiene los archivos de imagen JPEG sobre los que desea actuar, este se convierte en el directorio de trabajo de destino , y escriba el nombre que le dio a la secuencia de comandos, luego presione Entrar. Hará eco del nombre de cada archivo de imagen JPEG que se tomó en un iPhone.

  • Sugerencia: para navegar más fácilmente al directorio de trabajo de destino desde dentro de la Terminal, escriba cdseguido de un espacio, luego arrastre y suelte desde el Finder la carpeta de destino en la ventana de la Terminal. Esto completa el nombre de ruta completamente calificado para usted y luego puede presionar Enter. Ahora se encuentra en el directorio de trabajo de destino que contiene los archivos de imagen JPEG.

Código:

#!/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

Ahora, obviamente, querrá que haga algo más que repetir el nombre de un archivo de imagen JPEG que se tomó en un iPhone, por lo que tendrá que agregar comandos adicionales dentro del bucle for ... done.

En este ejemplo, quiero que todos los archivos de imagen JPEG que se tomaron en un iPhone se muevan a un directorio con el nombre "iPhone" dentro del directorio de trabajo . Así que modifiqué el guión en consecuencia.

Código editado:

#!/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

En resumen:

En el primer if ... fibloque, [[ ! -d "iPhone" ]]comprueba la existencia del directorio "iPhone" dentro del directorio de trabajo actual y, si aún no existe, lo crea el mkdircomando.

En el for ... doneciclo, solo busca archivos con extensiones .jpgy .JPG. ( Tengo ambos en mi sistema. )

La $xvariable estará vacía sin contener nada ""o "iPhone"al completar los comandos dentro de la "$(...)"sustitución del comando.

La salida del mdlscomando para el archivo de imagen JPEG se canaliza |al grepcomando que busca iPhoney, debido a la -oopción, será una cadena vacía o la palabra "iPhone" que se devuelve, que se convierte en el contenido de la $xvariable.

Por lo tanto, en el segundo if ... fibloque [[ ! -z "$x" ]]se prueba para ver que la "$x"variable no es una cadena vacía y cuando contiene algo, en este caso "iPhone", actuará sobre eso .jpgo .JPGarchivo. En el caso de $xno ser una cadena vacía, ya que solo puede contener nada o "iPhone", mueve ese archivo al directorio "iPhone" dentro del directorio de trabajo .

Notas:

Después de probar esto en varios lugares en medios de almacenamiento tanto internos como externos, noté que en algunos lugares los archivos estaban almacenados y que, si bien contenían el modelo de la cámara que los creó, no se reflejaba en la salida del comando mdlscomo esas ubicaciones fueron excluidas de la indexación por Spotlight. Por lo tanto, el uso del comando, proporcionado por un tercero, exiftoolaseguró la lectura de la información directamente desde el archivo en sí y no depender de la información indexada (o la falta de información indexada) a la que mdlsaccede el comando.

Entonces, si desea descargar e instalar ExifTool y usarlo, cambie mdlsa exiftoolen la x="$(mdls "$f" | grep -o 'iPhone')"línea del script para que se vea como x="$(exiftool "$f" | grep -o 'iPhone')".

En comparación con el mismo archivo de imagen JPEG, el exiftoolcomando mostró los valores de 23 etiquetas adicionales que el mdlscomando no mostró. Esto puede proporcionar información adicional para tomar la decisión mediante programación de cómo diferenciar absolutamente el origen de los archivos agregando código adicional al script que usaría información en las etiquetas adicionales, si es necesario.

¿No terminaría esto también con las imágenes que se enviaron a través de WhatsApp, ya que esas imágenes deberían (teóricamente) conservar sus datos EXIF? Por ejemplo, si tuviera un amigo que me envió una foto y la tomó con un iPhone, ¿los datos EXIF ​​ya no estarían presentes o no se incluirían en su secuencia de comandos también?
@smoooosher, Teóricamente, sí, los archivos JPEG provenientes de WhatsApp podrían contener "iPhone" que grepbuscaba, sin embargo, al mirar las imágenes vinculadas en el OP, la de WhatsApp no ​​muestra esa información. Eso, por supuesto, no significa que no exista, sin embargo, el propósito de la secuencia de comandos es mostrar una forma de actuar sobre los archivos dados en función de una variable y se puede codificar para verificar otra información que podría detener un falso positivo en este caso. . Aquí es donde obtendría exiftooluna sección transversal de información de varios archivos conocidos por cada fuente para ver qué puede delinear contra un falso positivo.
@smoooosher, como ejemplo, tengo entendido que WhatsApp no ​​envía una copia exacta del archivo de imagen original, también lo comprime e incluso puede eliminar parte de la información Exif original al hacerlo. No tengo WhatsApp instalado para jugar/probar. Por lo tanto, la secuencia de comandos podría codificarse aún más para que también busque un tamaño de archivo o tal vez los archivos que envía WhatsApp se etiquetan con la cadena, por ejemplo, "WhatsApp" y Spotlight no los indexa. Otra buena razón para usar exiftoolover mdls.