¿Cómo preservar las marcas de fecha JPEG durante el escalado de Automator?

3

Servicios de automatización integrados como menú contextual son una excelente manera de reducir rápidamente los archivos JPEG en el buscador. Haga clic derecho en el archivo, elija su secuencia de comandos de escala, hecho en segundos. El problema es que borra las marcas de fecha de los archivos , sobrescribiéndolos con la fecha de la operación de escalado.

¿Hay alguna forma de utilizar Automator para conservar las marcas de fecha durante el escalado?

Si no está en Automator, ¿hay una mejor manera de hacerlo?

    
pregunta SeanJ 03.01.2016 - 18:46

3 respuestas

3

Esta es una forma de lograr el objetivo establecido con un Servicio de automatización . En lugar de usar Imágenes a escala use Ejecutar script de shell con la configuración, Shell: / bin / bash y Ingreso de contraseña: como argumentos y agregue el siguiente código :

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 se puede omitir si va a utilizar Mostrar notificación de crecimiento , que no tengo y por qué usé un sonido de sistema. Esto se hizo bajo OS X 10.8.5 y deberá verificar que la ruta a los ejecutables sea la misma en su sistema, aunque debería ser la misma. La razón por la que estoy usando la ruta de acceso completa de cada ejecutable es que Automator se desactiva si no lo hago. Puede obtener el FQP en una Terminal usando which , por ejemplo, which sips devuelve /usr/bin/sips .

Tenga en cuenta que GetFileInfo y SetFile son parte de Xcode Tools y, si aún no están instaladas, deberá instalarlas, que pueden activarse escribiendo GetFileInfo en una Terminal y siguiendo las indicaciones.

Puedes leer las páginas del manual para cada uno de los comandos utilizados para obtener más información a través de la comprensión de lo que está sucediendo.

Páginas de manual para: GetFileInfo , < a href="https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/sips.1.html"> sips y SetFile

    
respondido por el user3439894 04.01.2016 - 07:54
0

El sistema de archivos en Mac OS X conserva 3 marcas de tiempo separadas para los archivos, de la siguiente manera:

ctime : hora de cambio (hora de la última modificación del propietario del archivo, permisos

atime : tiempo de acceso (cuando se accedió por última vez al archivo o al contenido)

mtime - Tiempo de modificación (cuando se modificaron por última vez los contenidos reales)

Si bien estos se configuran automáticamente durante las distintas etapas de la vida de un archivo a través de la interacción normal, es importante comprender que también pueden cambiarse a cualquier valor (válido) que desee en cualquier momento. Puede sobrescribir la última hora modificada a una fecha anterior, si realmente tiene 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$ 

Por lo tanto, todo lo que debe hacer es leer el tiempo existente que desea almacenar, realizar los cambios y luego restablecer de nuevo el original. Todo esto se puede hacer dentro de Automator.

Te dejaré que juegues con Automator a continuación, ya que no tengo tiempo, pero aquí hay una manera rápida y sucia (con muchos comentarios y comprobaciones para asegurarte de que lo entiendes y es no solo una carga de comandos de terminal) para leer una marca de tiempo, almacenarlo 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 scripts cortos modificados para aceptar el nombre de archivo proporcionado por Automator), y luego llamar a esos scripts como acciones individuales de Automator

Lo complicado está en capturar toda la cadena de fecha de una sola vez, ya que puedes ver los cambios de formato y pierdes el tiempo para mostrar el año de los archivos antiguos (y como acabamos de llegar al 2016, casi todos sus archivos simplemente mostrarán 2015 en lugar de la marca de tiempo si usa 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

... Entonces 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

Sin más preámbulos, aquí hay un hack horrible que alguien puede mejorar:

Paso 1 , lea la marca de hora y guárdela en una variable, y también en un archivo para poder recuperarla más adelante

Configura el archivo y dale una hora modificada anterior como si fuera un archivo antiguo, y enumera la hora modificada 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 reemplazarlo con dos puntos, luego usando / y : como delimitadores, imprima la fecha en el formato requerido por el comando táctil más adelante ( esto es un poco desagradable, pero esencialmente la primera pasada sin un delimitador provisto usa un espacio por defecto, que reemplacé con dos puntos, para que la la próxima pasada que delimita específicamente en : funciona correctamente; no pude usar un espacio y : y / en una pasada ... - pero la legibilidad era más importante que eficiencia ). Haga eco de la variable para demostrar que la ha creado correctamente, luego voltee en un archivo para que la tenga más tarde, lea el archivo para demostrarlo:

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 realice cambios en el archivo

Aquí solo agregué un texto, pero su Automator haría sus cosas aquí, luego imprimiría los tiempos modificados modificados para demostrar que había 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 Vuelva a colocar la marca de tiempo anterior

Ahora reinicie la marca de tiempo modificada, usando el archivo táctil como se muestra en la parte superior de esta respuesta, pero automatizando el bit donde incluimos la fecha para incluir el contenido del archivo que ahora sabemos incluye la marca de hora que necesitamos en la dirección correcta. formato:

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

Algunas verificaciones más para probar que la marca de tiempo original está en su lugar:

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
    
respondido por el stuffe 04.01.2016 - 00:32
0

Es posible hacer esto sin la necesidad de descargar Xcode

Con el comando sips en la acción " Ejecutar script de shell " para reemplazar la acción " Escala de imágenes ".

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

El script de bash:

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

Puedes cambiar la calidad (el número after -s formatOptions ) 0-100 , el valor predeterminado es 80 .

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

    
respondido por el jackjr300 06.01.2016 - 22:07

Lea otras preguntas en las etiquetas