Creación de tiempo de copia por lotes y fecha de modificación de archivos usando OSX

En primer lugar, hice la misma pregunta en el desbordamiento de la pila, pero no estoy seguro de si está justo allí. Es por eso que decidí publicarlo aquí también.

Me está costando mucho intentar copiar la fecha de creación y modificación de unos archivos a otros archivos.
He convertido algunos archivos MXF a MOV, pero lamentablemente los nuevos archivos MOV no tienen la misma fecha de creación.
Ahora busqué preguntas similares y encontré diferentes respuestas, pero esta parece ser la más simple:

    #!/bin/bash
    for f in *.MXF; do
     touch -r "$f" "${f%MXF}mov"
    done


Desafortunadamente, no funciona para mí, ni con Terminal ni con Automator.
Guardé el código con TextEdit. En la Terminal ejecuté chmod+x para hacer que el archivo fuera ejecutable y lo puse en la carpeta donde están mis MXF y movs.

Pero recibo el siguiente error:
toque: *.MXF: No existe tal archivo o directorio.
También probé mxf en lugar de MXF.

Esta es la salida de ls-l de la carpeta de prueba

-rwxrwxrwx  1 username  staff  258458160  5 Jan  2014 570_0301.MXF
-rwxrwxrwx  1 username  staff  241431870  5 Jan  2014 570_0301.mov
-rwxrwxrwx  1 username  staff  974595120  5 Jan  2014 570_0306.MXF
-rwxrwxrwx  1 username  staff  911745994  5 Jan  2014 570_0306.mov
-rwxrwxrwx  1 username  staff  667679280  5 Jan  2014 570_0308.MXF
-rwxrwxrwx  1 username  staff  624468526  5 Jan  2014 570_0308.mov

Debido a que logré copiar la fecha de modificación, parece que todos los archivos ya tienen la misma fecha, pero esto no cubre la fecha de creación.

¿Quizás alguien podría ayudarme? ¿Cambiará la fecha de modificación y creación? Porque ambos son importantes... ¡
Muchas gracias de antemano y todo lo mejor!


EDITAR: El script funcionó gracias a user3439894.
Pero sigue sin actualizar la fecha de creación...
MXF: creado el 05.01.2014 06:49, modificado el 05.01.2014 06:50
mov: creado el 23.06.2016 05:34, modificado el 05.01.2014 06:50

¿Hay alguna manera de corregir esto?

Tiene mucho que hacer en esta pregunta y Stack Overflow es probablemente un mejor lugar para preguntar. Dicho esto, modificaría la pregunta para tener solo un bloque de código sobre lo que está tratando de intentar y luego seguiría [Cómo crear un ejemplo mínimo, completo y verificable} ( stackoverflow.com/help/mcve ) para incluir con ese bloque de código. También incluya en la información la salida del ls -ldirectorio de destino. Continúa en el siguiente comentario...
Además, con un puñado de archivos $filename.MXFy que coincidían con cada conjunto de archivos y , ¡probé el n. ° 1 y funcionó bien! Entonces, ¿qué problema tienes con eso? Tenga en cuenta que los archivos no pueden ser ya que distingue entre mayúsculas y minúsculas. Lo mismo vale para , debe ser eso y no . (Por eso dije incluir la salida de ls -l para el directorio de destino). $filename.mov$filename.MXF.movfor f in *.MXF; do touch -r "$f" "${f%MXF}mov"; done.MXF.mxf.mov.MOV
@user3439894 Gracias por su información. ls -l muestra -rwxrwxrwx para todos los archivos dentro de la carpeta y drwxrwxrwx para la carpeta. Si el n. ° 1 funciona bien para usted (y aparentemente para muchas otras personas), ¿qué estoy haciendo mal para obtener "toque: * .MXF: no existe tal archivo o directorio"?
Cuando ejecuta el código desde el n. ° 1, ¿está en el directorio que contiene los archivos .MXFy ? .movPor cierto, ¡no pregunté solo si los permisos en todos los archivos eran los mismos! Pedí la salida del ls -ldirectorio de destino para poder ver los nombres de los archivos, etc. Además, es por eso que dije que tiene mucho que hacer en esta pregunta y que lo limite a un bloque de código y proporcione un mínimo , Completo y Verificable ejemplo . ¡No puede esperar que lo ayudemos si no tenemos todos los datos relevantes!
Gracias de nuevo por la rápida respuesta. Inserté todo el código que encontré para dar una visión general de lo que probé y encontrar la mejor solución para lo que quiero hacer... Sabré editar toda la pregunta, solo un segundo...
La fecha de creación es específica del sistema de archivos HFS+. Al intentar cambiar estos metadatos en un sistema de archivos externo, su kilometraje puede variar. Su touchcomando solo opera en el tiempo de acceso y modificación que debería cambiar el tiempo de cambio, no el tiempo de creación. SetFilees la herramienta que necesitas usar.
@fd0 ¿Tiene un ejemplo de cómo obtener lo que quiero con SetFile? Gracias por la información.
@fd0, Using GetFileInfo -d $filename.mov, que obtiene la fecha de creación, muestra lo mismo $filename.movdespués de la ejecución for f in *.MXF; do touch -r "$f" "${f%MXF}mov"; doneque para $filename.MXF. Entonces, ¿por qué se SetFilenecesita?
@ user3439894 Tienes razón. Mi mal, no probé touch -r, leí el manual que es incorrecto.
@ user3439894 Gracias por aclarar. ¿Sabes si hice algo mal al crear el script? ¿Cómo lo ejecutaste?
@phramenma, en la Terminal I cdal directorio que contiene los archivos .MXFy .movy luego en la línea de comando utilizada exactamente:for f in *.MXF; do touch -r "$f" "${f%MXF}mov"; done
@ user3439894 ¡Esto parece estar funcionando! PERO todavía no actualiza la fecha de creación... MXF: creado el 05.01.2014 06:49, modificado el 05.01.2014 06:50 – mov: creado el 23.06.05:34, modificado el 05.01.2014 06:50 ¿Hay alguna manera de corregir esto?
@phramenma, en Terminal, ¿cuál es el resultado de:uname -a; bash --version
@user3439894 Aquí está el resultado: Darwin Kernel Versión 15.4.0: viernes 26 de febrero 22:08:05 PST 2016; root:xnu-3248.40.184~3/RELEASE_X86_64 x86_64 GNU bash, versión 3.2.57(1)-release (x86_64-apple-darwin15) Copyright (C) 2007 Free Software Foundation, Inc.

Respuestas (2)

Como esto no funciona para usted, le sugiero que haga lo que sugirió fd0 y use SetFile. Esto se usará junto con GetFileInfo, los cuales son parte de las herramientas de línea de comandos para Xcode.

No necesita instalar Xcode.app, que es de ~3,80 GB, solo ~160 MB para las herramientas de línea de comandos para Xcode.

En terminal:xcode-select --install

Consulte Cómo instalar herramientas de línea de comandos en OS X Mavericks y Yosemite (sin Xcode) , que también es para OS X El Capitan.

Aquí hay un script bash para usar con SetFiley GetFileInfo:

#!/bin/bash

for f in *; do

    if [[ -f $f ]] && [[ ${f##*.} == MXF ]] && [[ -f ${f%.*}.mov ]]; then

        cDate="$(GetFileInfo -d "$f")"
        mDate="$(GetFileInfo -m "$f")"

        SetFile -d "$cDate" -m "$mDate" "${f%.*}.mov"

    fi

done

ingrese la descripción de la imagen aquí

Supongo que estos archivos no residen en un sistema de archivos HFS+ como dije antes en YMMV.
@fd0, Desafortunadamente, phramenma no dijo dónde residen los archivos o qué sistema de archivos. for f in *.MXF; do touch -r "$f" "${f%MXF}mov"; donefunciona bien para mí en un sistema de archivos HFS+. Ambos staty GetFileInfome confirma que me funciona sin necesidad de usar SetFile. Si, dado que no funciona, es más fácil para mí ofrecer una SetFilesolución como lo he hecho algunas veces en el pasado con otras publicaciones.
@user3439894 Muchas gracias por su gran ayuda. Te lo agradezco mucho y el tiempo que dedicas a mis problemas. :/ Los archivos se almacenan en un exFat-HDD. Pero desafortunadamente el código original solo copió la fecha de modificación. ¡Tu nuevo guión acaba de funcionar! ¡¡¡Gracias de nuevo!!! PD: ¿Qué aplicación usaste en la captura de pantalla?
@phramenma, De nada, me alegro de haber podido ayudar. Usé Sublime Text y lo uso para algunas de mis necesidades de secuencias de comandos.
@@phramenma, agregué otra prueba al comienzo de mi if declaración : if [[ -f "$f" ]] && ..., solo por si acaso. De esta manera, lo que sea que esté en el directorio solo si es un archivo normal que termina en .MXFy tiene un archivo correspondiente, .movGetFileInfo obtendrá la fecha y hora de creación y la fecha y hora modificada y las aplicará al archivo de destino.

Si solo necesita copiar la fecha de modificación a la fecha de creación en los mismos archivos, puede usar mi secuencia de comandos modificada:

#!/bin/bash

for f in *; do


    cDate="$(GetFileInfo -d "$f")"
    mDate="$(GetFileInfo -m "$f")"

    SetFile -d "$mDate" "$f"


done