4 votos

¿Cómo conservar los sellos de fecha de JPEG durante el escalado de Automator?

Servicios de automatización incrustados como un menú contextual son una gran manera de reducir rápidamente los JPEG en el buscador. Haz clic con el botón derecho del ratón en el archivo, elige tu script, y listo en segundos. El problema es que borra las marcas de fecha de los archivos sobreescribiéndolos con la fecha de la operación de escalado.

¿Existe una forma de utilizar Automator para conservar las marcas de fecha durante el escalado?

Si no es en Automator, ¿hay alguna forma mejor de hacerlo?

Sample JPEG scaling service created with Automator

0 votos

Si modificas un archivo, se supone que su fecha/hora cambiará y es un comportamiento bastante normal.

0 votos

Como otros han señalado, la fecha de modificación cambiará. Yo uso un programa de línea de comandos (gratuito) para copiar las fechas Exif desde el jpeg al campo de la fecha. También tengo un Automator script para hacer esto que consiste en el simple bash script jhead -ft "$*" . Si desea esta búsqueda para jhead .

0 votos

Hola Milliways, esta solución es aún más sencilla que el script que tenía en mente. He buscado por ahí y he descubierto que puedo comprobar la información EXIF usando el software de Fotos o usando Obtener Información (Cmd+I) en Más, aunque la fecha no aparece por separado ahí. He encontrado Programa jhead de Matthias Wandel .

3voto

user3439894 Puntos 5883

Esta es una forma de lograr el objetivo indicado con un Servicio de automatización . En lugar de utilizar Imágenes a escala utilice Ejecutar Shell script con ajustes, Shell: /bin/bash y Pasar la entrada: Como argumentos y añadir lo siguiente código a ella:

for f in "$@"; do

        # Get the creation date time stamp of the target file, saved as 't'.

    t="$(/usr/bin/GetFileInfo -d "$f")"

        # Get the pixel width of the target file and divide it by 2 for a 50% scaling, saved as 'w'.

    w="$(/usr/bin/sips -g pixelWidth "$f" | /usr/bin/grep pixelWidth | /usr/bin/awk '{print $2/2}')"

        # Scale the target file.

    /usr/bin/sips --resampleWidth $w "$f"

        # Set the modified and creation date time stamps of the target file to the saved value held in 't'.

    /usr/bin/SetFile -m "$t" -d "$t" "$f"

done
        # Notify User operation is finished.
/usr/bin/afplay "/System/Library/Sounds/Purr.aiff"

Tenga en cuenta que la última línea del código anterior puede omitirse si va a utilizar Mostrar notificación de gruñido que no tengo y por eso he utilizado un sonido de sistema. Esto se hizo bajo OS X 10.8.5 y tendrás que verificar que la ruta de los ejecutables es la misma en tu sistema, aunque deberían ser los mismos. La razón por la que utilizo la ruta completa de cada ejecutable es porque Automator da error si no lo hago. Puedes obtener el FQP en un Terminal usando which Por ejemplo, which sips devuelve /usr/bin/sips .

Tenga en cuenta que GetFileInfo y SetFile forman parte de las herramientas de Xcode y, si no están ya instaladas, es necesario instalarlas, lo que puede hacerse escribiendo GetFileInfo en un Terminal y seguir las indicaciones.

Puedes leer las páginas del manual de cada uno de los comandos utilizados para comprender mejor lo que ocurre.

Páginas del manual para: GetFileInfo , sorbos y SetFile

Automator Service

0 votos

¡Excelente script! He jugado un poco con los sips pero no he conseguido el 50%. Una buena solución. Después de que uno lo ve, siempre parece tan simple. Muchas gracias.

0 votos

@ otros que quieran usar este genial script sin crearlo ellos mismos desde cero, descarguen el Archivo ZIP y póngalo en la carpeta de Servicios (normalmente /Usuarios/su_usuario/Biblioteca/Servicios/). Inícialo haciendo clic con el botón derecho sobre una imagen en el Finder y seleccionando el script del submenú Servicios. Ten en cuenta que, como dijo user343.., necesitas las herramientas de Xcode y puede que tengas que ajustar las rutas en el script.

0 votos

@SeanJ, ¿Estás diciendo que jugaste con sips antes de que vieras mi respuesta y no pudieras hacerla funcionar? Lo pregunto porque el script tal y como está escrito sips se da la mitad de la anchura en píxeles del archivo original como $w que en mis pruebas siempre ha funcionado.

0voto

mtnygard Puntos 141

El sistema de archivos en Mac OS X conserva 3 marcas de tiempo separadas para los archivos, como sigue:

ctime - hora de modificación (última hora de modificación del propietario del archivo, permisos

atime - Hora de acceso (cuándo se accedió por última vez al archivo o al contenido)

mtime - Hora de modificación (cuándo se modificó el contenido por última vez)

Aunque se establecen automáticamente durante las distintas etapas de la vida de un archivo a través de la interacción normal, es importante entender que también se pueden cambiar a cualquier valor (válido) que desee en cualquier momento. Puedes sobrescribir la última hora de modificación a una fecha anterior, si realmente tienes que hacerlo, etc, con un simple comando de terminal:

StuffeMac:~ stuffe$ touch dan.txt
StuffeMac:~ stuffe$ ls -l dan.txt
-rw-r--r--  1 stuffe  staff  0  3 Jan 22:30 dan.txt
StuffeMac:~ stuffe$ touch -mt 201601022359 dan.txt
StuffeMac:~ stuffe$ ls -l dan.txt
-rw-r--r--  1 stuffe  staff  0  2 Jan 23:59 dan.txt
StuffeMac:~ stuffe$ 

Así que todo lo que necesita hacer, es leer la hora existente que desea almacenar, hacer sus cambios, y luego restablecer el original. Todo esto se puede hacer dentro de Automator.


Te dejo que juegues a meter lo de abajo en Automator, ya que no tengo tiempo, pero aquí tienes una forma rápida y sucia (con muchos comentarios, y comprobaciones para asegurarte de que lo entiendes y no es sólo una carga de comandos de terminal) de leer una marca de tiempo, almacenarla en un archivo para más tarde, y luego volver a aplicar la misma marca de tiempo usando la línea de comandos.

Debería poder guardarlos como breves scripts modificados para aceptar el nombre del archivo tal y como lo proporciona Automator), y luego llamar a esos scripts como acciones individuales de Automator


Lo complicado está en capturar toda la cadena de fechas de una sola vez, como puedes ver el formato cambia, y pierdes la hora para poder mostrar el año de los archivos antiguos (y como acabamos de entrar en 2016, casi todos tus archivos simplemente mostrarán 2015 en lugar de la marca de tiempo si usas ls ...

drwxr-xr-x+   5 stuffe  staff   170  3 May  2015 Public
-rw-r--r--    1 stuffe  staff     0  2 Jan 23:59 dan.txt

...Así que puedes usar otros comandos, como getfileinfo en su lugar:

StuffeMac-6:~ stuffe$ getfileinfo -m Public
05/03/2015 13:07:33
StuffeMac-6:~ stuffe$ getfileinfo -m dan.txt
01/02/2016 23:59:00

Así que sin más preámbulos, aquí está un horrible hack que alguien puede mejorar:

Paso 1 leer la marca de tiempo y almacenarla en una variable, y también en un archivo para que podamos recuperarla más tarde

Configurar el archivo y darle un tiempo de modificación anterior como si fuera un archivo antiguo, y la lista de la hora de modificación para probar:

StuffeMac-6:~ stuffe$ touch originalfile.txt
StuffeMac-6:~ stuffe$ touch -mt 201506051200 originalfile.txt
StuffeMac-6:~ stuffe$ ls -l originalfile.txt
-rw-r--r--  1 stuffe  staff  0  5 Jun  2015 originalfile.txt
StuffeMac-6:~ stuffe$ getfileinfo -m originalfile.txt
06/05/2015 12:00:00

Ahora leemos la marca de tiempo, y la pasamos a través de un comando llamado awk un par de veces para eliminar el espacio en la marca de tiempo y sustituirlo por dos puntos, y luego usar / y : como delimitadores, imprime la fecha en el formato que requiere el comando touch más adelante ( esto es un poco desagradable, pero esencialmente la primera pasada sin un delimitador proporcionado utiliza un espacio por defecto, que reemplazo con dos puntos, de modo que la siguiente pasada que delimita específicamente en : funciona correctamente - no pude conseguir que usara un espacio y : y / en una sola pasada... - pero la legibilidad era más importante que la eficiencia ) . Haz un eco de la variable para demostrar que la has creado correctamente, luego vuélcala en un archivo para que la tengas después, lee el archivo para comprobarlo:

StuffeMac-6:~ stuffe$ origtimestampvariable=`getfileinfo -m originalfile.txt | awk '{print $1":"$2}'|awk -F[/:] '{print $3$2$1$4$5}'`
StuffeMac-6:~ stuffe$ echo $origtimestampvariable
201505061200
StuffeMac-6:~ stuffe$ echo $origtimestampvariable > origtimestampvariable.txt
StuffeMac-6:~ stuffe$ more origtimestampvariable.txt
201505061200

Paso 2 Ahora haz cambios en el archivo

Aquí sólo añado algo de texto, pero su Automator haría sus cosas aquí, y luego imprimiría las veces modificadas para demostrar que ha cambiado:

StuffeMac-6:~ stuffe$ echo "making changes to the file now to change modified time" >> originalfile.txt
StuffeMac-6:~ stuffe$ ls -l originalfile.txt
-rw-r--r--  1 stuffe  staff  55  3 Jan 23:17 originalfile.txt
StuffeMac-6:~ stuffe$ getfileinfo -m originalfile.txt
01/03/2016 23:17:05

Paso 3 Vuelve a poner la antigua marca de tiempo

Ahora restablece la marca de tiempo modificada, utilizando el archivo táctil como se muestra en la parte superior de esta respuesta, pero automatizando la parte donde incluimos la fecha para incluir el contenido del archivo que ahora sabemos que incluye la marca de tiempo que necesitamos en el formato correcto:

StuffeMac-6:~ stuffe$ touch -mt `cat origtimestampvariable.txt` originalfile.txt

Algunas comprobaciones más para demostrar que la marca de tiempo original está en su sitio:

StuffeMac-6:~ stuffe$ ls -l originalfile.txt
-rw-r--r--  1 stuffe  staff  55  6 May  2015 originalfile.txt
StuffeMac-6:~ stuffe$ getfileinfo -m originalfile.txt
05/06/2015 12:00:00

0 votos

Hola stuffe, gracias por la explicación detallada. Todavía soy un usuario novato de Terminal, pero me las arreglé con tu guía. Para la reducción regular de la foto voy a ir con Automator ya que la diferencia de tiempo haciéndolo con bash va a sumar.

0voto

Baczek Puntos 150

Es posible hacerlo sin necesidad de descargar Xcode

Con la sips en la sección " Ejecutar Shell script " para sustituir la acción " Imágenes a escala " acción.

El script utiliza el stat para obtener las fechas de creación y modificación del archivo, y el comando touch para cambiar las fechas del archivo.

El bash script:

for f in "$@"
do
    newSize=$(sips -g pixelWidth -g pixelHeight "$f" | awk 'BEGIN{max=0} /pixel/{if(max<$NF){max=$NF}} END{print max/2}')
    if [ $newSize != "0" ]; then
        tDates=($(stat -f "%SB %Sm" -t "%Y%m%d%H%M.%S" "$f"))
        sips -Z $newSize -s formatOptions 95 "$f" && touch -t ${tDates[0]} "$f" && touch -t ${tDates[1]} "$f"
    fi
done

Puede cambiar la calidad (el número after -s formatOptions ) 0-100 el valor por defecto es 80 .

100 \= la mejor calidad y el archivo más grande, 0 \= mala calidad y archivo más pequeño.

0 votos

Buena respuesta, aunque tal y como está escrita falla con syntax error near unexpected token (' y tDates =($(stat -f "%SB %Sm" -t "%Y%m%d%H%M.%S" "$f"))' por lo que hay que eliminar el espacio en tDates = . Además, no es necesario descargar Xcode. Xcode y Xcode Tools son dos cosas diferentes y bastante diferentes en tamaño. Xcode tiene más de 4 GB y Xcode Tools menos de 200 MB. Sin embargo, es bueno tener una solución nativa también.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X