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?
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 filename
donde " 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 cd
comando 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.
cd
seguido 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 ... fi
bloque, [[ ! -d "iPhone" ]]
comprueba la existencia del directorio "iPhone" dentro del directorio de trabajo actual y, si aún no existe, lo crea el mkdir
comando.
En el for ... done
ciclo, solo busca archivos con extensiones .jpg
y .JPG
. ( Tengo ambos en mi sistema. )
La $x
variable estará vacía sin contener nada ""
o "iPhone"
al completar los comandos dentro de la "$(...)"
sustitución del comando.
La salida del mdls
comando para el archivo de imagen JPEG se canaliza |
al grep
comando que busca iPhone
y, debido a la -o
opción, será una cadena vacía o la palabra "iPhone" que se devuelve, que se convierte en el contenido de la $x
variable.
Por lo tanto, en el segundo if ... fi
bloque [[ ! -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 .jpg
o .JPG
archivo. En el caso de $x
no 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 mdls
como esas ubicaciones fueron excluidas de la indexación por Spotlight. Por lo tanto, el uso del comando, proporcionado por un tercero, exiftool
aseguró 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 mdls
accede el comando.
Entonces, si desea descargar e instalar ExifTool y usarlo, cambie mdls
a exiftool
en 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 exiftool
comando mostró los valores de 23 etiquetas adicionales que el mdls
comando 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.
más suave
usuario3439894
grep
buscaba, 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íaexiftool
una sección transversal de información de varios archivos conocidos por cada fuente para ver qué puede delinear contra un falso positivo.usuario3439894
exiftool
overmdls
.