¿Establecer la marca de tiempo del archivo creado/modificado en el primero de los 2 para una tonelada de archivos?

Busqué una respuesta a esto por un tiempo, pero no pude encontrar una. Tengo muchos archivos wav (miles de ellos) en una biblioteca de sonido que de alguna manera actualizó la fecha de modificación o creación recientemente, aunque no los he tocado de ninguna manera durante años.

¿Hay alguna forma en que pueda usar Automator para crear una aplicación en la que pueda arrastrar y soltar estos archivos (o un archivo de texto que contenga todas sus rutas y nombres de archivo) que haría lo siguiente?:

  • Verifique los datos de marca de tiempo asociados con el archivo (fecha/hora: modificado y creado)
  • Verifique qué marca de tiempo es la anterior de las dos
  • Si la marca de tiempo creada es anterior a la modificada, cambie la marca de tiempo modificada por la creada, o viceversa.

Sé cómo modificar o crear la fecha en la terminal y cómo recorrer los archivos recibidos como entrada. Pero no estoy seguro de cómo comparar las marcas de tiempo en una secuencia de comandos para determinar cuál es anterior, o cómo formatear específicamente la secuencia de comandos/aplicación que haría esto automáticamente para cada archivo.

Obtuve el siguiente script de otro hilo. Pero esto solo establecerá la fecha de modificación en la fecha de creación sin verificar cuál es anterior.

for f in *.wav; do
   olddate=$(stat -f %SB -t %Y%m%d%H%M "$f")
   touch -m -t $olddate "$f"    
done

Y en caso de que marque la diferencia, estoy en una MacBook Pro con macOS Sierra 10.12.6.

Por último, si esto sería más apropiado para una red diferente (tal vez stackoverflow o superusuario), por favor LMK y preguntaré allí en su lugar.

¡Gracias por adelantado por la ayuda!

Respuestas (1)

El código de script de shell de ejemplo , que se muestra a continuación, usa y de Command Line Tools para Xcode , que este último es necesario para cambiar la fecha de creación , ya que solo puede cambiar los tiempos de acceso y modificación . GetFileInfoSetFiletouch

Si no tiene Xcode instalado, simplemente instale las herramientas de línea de comandos para Xcode ...

En terminal:xcode-select --install

Después de instalar Command Line Tools para Xcode , en Automator puede crear un flujo de trabajo o Servicio/Acción rápida con las acciones adecuadas para pasar los archivos de destino a una acción Ejecutar script de Shell con la configuración Shell: [/bin/bash] y Pasar entrada: [como argumentos] utilizando el siguiente código de script de shell de ejemplo :

for f in "$@"; do

    [ -f "$f" ] || continue

    c="$(GetFileInfo -d "$f")"
    m="$(GetFileInfo -m "$f")"

    ec="$(date -j -f "%m/%d/%Y %H:%M:%S" "$c" +%s)"
    em="$(date -j -f "%m/%d/%Y %H:%M:%S" "$m" +%s)"

    if [ "$ec" -lt "$em" ]; then
        SetFile -m "$c" "$f"
    fi

    if [ "$em" -lt "$ec" ]; then
        SetFile -d "$m" "$f"
    fi

done

Cómo funciona el script de shell :

  • for f in "$@"; do-- Para cada archivo hacer algo .
  • [ -f "$f" ] || continue-- Si no es un archivo , vaya al siguiente elemento pasado.
  • c="$(GetFileInfo -d "$f")"-- Obtiene la fecha de creación del archivo .
  • m="$(GetFileInfo -m "$f")"-- Obtiene la fecha de modificación del archivo .
  • ec="$(date -j -f "%m/%d/%Y %H:%M:%S" "$c" +%s)"-- Convierte la fecha de creación al número de segundos desde Epoch .
  • em="$(date -j -f "%m/%d/%Y %H:%M:%S" "$m" +%s)"-- Convierte la fecha de modificación al número de segundos desde Epoch .
  • if [ "$ec" -lt "$em" ]; then-- Si los segundos de la fecha de creación de época son menores que los segundos de la fecha de modificación de época , entonces:
    • SetFile -m "$c" "$f"-- Establece la fecha de modificación del archivo a la fecha de creación del archivo .
  • if [ "$em" -lt "$ec" ]; then-- Si los segundos de la fecha de modificación de época son menores que los segundos de la fecha de creación de época , entonces:
    • SetFile -d "$m" "$f"- Establece la fecha de creación del archivo a la fecha de modificación del archivo .

Notas:

Época (00:00:00 UTC, 1 de enero de 1970; ver hora(3).



Ejemplo de flujo de trabajo de Automator :

Simplemente agregue la carpeta principal que contiene los archivos .wav a la acción Obtener elementos del buscador especificados y configure el resto de las acciones como se muestra en la imagen a continuación.

Tenga en cuenta que esto es solo un ejemplo, la parte principal es la acción Ejecutar secuencia de comandos de Shell , por lo que, sin embargo, desea pasarle los archivos de destino , es su elección.

ingrese la descripción de la imagen aquí

Oye, acabo de probar esto para una carpeta y no funcionó. ¿Hay algo que podría cambiar para que también funcione para que las carpetas cambien la fecha de modificación a la anterior de las dos (creada o modificada)?
@Max Bueno, RE: "Oye, acabo de probar esto para una carpeta y no funcionó". -- Bueno, eso era de esperar, ya que está filtrando archivos wav , no carpetas , y como se describe en 'Cómo funciona el script de shell : ' si no es un archivo , no lo procesa. Debe cambiar el flujo de trabajo de Automator para pasar carpetas a la acción Ejecutar script de Shell y eliminar la prueba de archivos en la acción Ejecutar script de Shell .
En realidad, configuré el flujo de trabajo de Automator para recibir archivos y carpetas como entrada, y los pasé a bin/bash shell como argumentos, de modo que también pudiera usarlo para otros archivos. Simplemente no funcionaría para una carpeta cuando le pasara eso. Pero parece que comentar la línea "[ -f "$f" ] || continuar" funcionó. ¡Gracias de nuevo! :)