Querer ayuda para crear un applescript que se ejecute cuando cambie el contenido de una carpeta

Agradecería mucho alguna ayuda con lo siguiente.

Mi escenario:

Tengo una aplicación para Mac que genera archivos RTF. Tengo una aplicación de Android que se ocupa de los archivos MultiMarkdown/Markdown.

La aplicación Mac funciona con proyectos, y estos tienen cualquier cantidad de archivos. Puede sincronizar automáticamente los archivos en un proyecto dado a una carpeta. Esencialmente, colocará en la carpeta un montón de archivos cada vez que se sincronice (al abrir y cerrar, y manualmente). Cualquier cambio en esa carpeta se sincroniza automáticamente con mi dispositivo Android.

Sin embargo, necesito que se conviertan a archivos .mmd antes de que eso suceda, y que se vuelvan a convertir a RTF cuando los archivos se cambien (o sean nuevos) desde el dispositivo Android.

Así que esto es lo que tengo en mente. Lo que me gustaría es configurar las cosas de tal manera que cuando los archivos se sincronicen desde la aplicación Mac a su carpeta de destino, esos archivos se conviertan automáticamente de RTF a MMD. Ya tengo los scripts que harán la conversión real. Y cuando los archivos MMD cambien, se convertirán automáticamente a archivos RTF. También tengo un guión para esto.

Las preguntas que tengo son estas:

  1. ¿Cómo puedo monitorear automáticamente una carpeta en busca de cambios en su contenido y ejecutar un script si los archivos cambian en esa carpeta?
  2. ¿Cómo podría hacer que esto funcione de dos maneras, sin lanzar todo en un bucle sin fin? Al principio pensé que podría hacer lo siguiente:

Conversión bidireccional:

  1. Crea dos carpetas en la Mac. Uno es para archivos RTF, el otro es para archivos MMD.
  2. Configure la aplicación Mac para sincronizar sus datos desde y hacia la carpeta RTF
  3. Configure el sistema de sincronización de Mac a Android (Dropbox, Bittorrent Sync, etc.) para sincronizar el contenido de la carpeta MMD con una carpeta en el dispositivo Android.
  4. Cuando cambie el contenido de las carpetas RTF, convierta los archivos a MMD y coloque la salida en la carpeta MMD. Y viceversa.

Pero, obviamente, esto creará un ciclo sin fin, porque cada acción desencadenará la acción inversa, sin fin.

Una posible forma de evitar este bucle sin fin podría ser esta:

  • La carpeta RTF tiene asignado el script R. Cuando cambia el contenido, se ejecuta el script R.
  • La carpeta MMD tiene asignado el script M. Cuando cambia el contenido, se ejecuta el script M.
  • Cuando se detecta un cambio en la carpeta RTF, lo primero que hace el script R es deshabilitar la activación del script M. Lo último que hace el script R antes de salir es habilitar el script M nuevamente. De esa forma, M no 'notará' que el contenido de la carpeta estaba cambiando mientras R actualizaba su contenido con archivos recién convertidos.
  • Lo mismo se aplicaría a la inversa.

Pero tal vez hay una mejor manera?

Estoy ansioso por aprender más sobre secuencias de comandos y, en el proceso, resolver este problema.

¿Hay personas con ideas factibles sobre cómo lograr lo que espero lograr aquí?

Respuestas (2)

Crearía un script que monitoree ambas carpetas. Mi lenguaje de elección para esto es Python. AppleScript no es muy adecuado para este tipo de operación. La idea básica es escuchar FSEvents en las dos carpetas en cuestión y, cuando ocurra uno, anular rápidamente la programación del flujo de eventos para la otra carpeta, realizar alguna operación de conversión y sincronización, y luego reprogramar el flujo de eventos previamente no programado.

El script completo, descargado aquí, con versiones modificadas de esos scripts que me mostraste. La instalación de MacFSEvents ahora es automática: https://www.dropbox.com/s/oylvewk90ezwb3s/File%20Sync.app.zip?dl=1

Estos son los pasos para usarlo:

Extraiga el subprograma, haga clic con el botón derecho en él y seleccione "Mostrar contenido del paquete", abra Contenido y recursos, luego edite la lista dentro con sus pares de carpetas RTF y MMD. Podrá especificar tantos pares como necesite para mantenerse sincronizados entre sí, solo mantenga el mismo formato que usé en el plist: una matriz por par, cada una con dos elementos, siendo el primer elemento la ruta a la carpeta RTF, siendo la segunda la ruta a la carpeta MMD. Verás esto cuando abras el plist.

Esto debería funcionar sin ningún problema. Ahora se observarán las carpetas en busca de cualquier tipo de modificación, y los archivos se convertirán y transferirán a la otra carpeta.

Hola Froggard. Con respecto al problema que enfrentamos con Pandoc que no maneja los encabezados en la conversión (MMD>) HTML> RTF... Alguien en los foros de Pandoc sugirió que necesitamos usar XSLT para eso. Se ha ofrecido a preparar algunos scripts de Perl que lo harán. ¿Es eso algo que podríamos incorporar en nuestro applet?
Definitivamente

Estoy totalmente a favor de que las personas aprendan a crear secuencias de comandos, pero para el uso diario y la flexibilidad, volver a implementar partes de Hazel de NoodleSoft es menos potente y eficiente para una solución de propósito general.

Icono de avellana pequeño

Nuevamente, felicitaciones a Froggard e Inspired Life por la excelente respuesta y la pregunta práctica.

El propósito principal de escribir guiones para personas es expandir mi experiencia y conocimiento de guiones. Personalmente, no me importa si hay una aplicación que pueda hacerlo, ya que la diversión está en hacerlo yo mismo y que funcione perfectamente. En estos días, hay muy poco que no puedo escribir, y dado que necesito mantener mis habilidades en forma para el trabajo que hago, vale la pena hacer un esfuerzo adicional con estas cosas. Sin embargo, entiendo tu aprensión. He visto algunos guiones horriblemente elaborados en Internet.
@Froggard Sí, respondo esto para todas las personas que aún no tienen picazón. Quiero docenas de preguntas en el sitio sobre cómo escribir este conjunto particular de requisitos y sobre una herramienta específica. Python, AppleScript o incluso cómo configurar las reglas de Hazel para hacer XYZ. Probablemente debería dedicar tiempo a resolver esto y editarlo en mi publicación aquí. Nuevamente, el bricolaje es tan importante y por eso voté la pregunta y la respuesta.
Ciertamente. A menudo hay más de una respuesta correcta, dependiendo de los requisitos de cada individuo.
Gracias bmike. Encontré entonces la noción de usar Hazel. Solía ​​tener Hazel en mi máquina hace algunos años... hace numerosas actualizaciones del sistema operativo. Pensé que todavía tendría que hacer que ejecutara los scripts apropiados, y tampoco pude ver de inmediato una forma en que pudiera manejar el monitoreo bidireccional de carpetas duales requerido en esta situación. También cuesta $ 30 y otra aplicación que se ejecuta continuamente en mi computadora solo para hacer esto. Parecía una matanza excesiva. Eso sí, si Froggard no hubiera sido tan generoso con su tiempo, podría haber recurrido a piratear algo junto con Hazel en la mezcla.
Sin embargo, aprecio tu participación con esta sugerencia. Alguien más con un problema similar que resolver puede encontrar que seguir la ruta de Hazel es la mejor solución en su caso.