2 votos

Cómo hacer Smart folder como carpeta física con el contenido combinado de dos carpetas

Tengo una aplicación que busca sus ficheros de datos (*.txt) en una carpeta. Tengo dos carpetas que contienen datos de texto que necesito mantener separadas, pero sería útil que la aplicación viera los archivos de datos de texto como si residieran en una carpeta (que contiene los dos conjuntos de archivos).

Puedo crear un script que mantenga enlaces simbólicos a los archivos de las dos carpetas en una tercera carpeta combinada.

En lugar de reinventar la rueda, me gustaría utilizar una solución probada si es posible.

La solución tendría que tratar el caso de las coincidencias de nombres de archivos de una manera sensata.

7voto

Phill Puntos 126

Puede utilizar launchd .

launchd le permite gestionar demonios y agentes de acuerdo con ciertas condiciones.

¿Qué son los demonios y los agentes?

En man launchd :

Un "demonio" es, por definición, un servicio para todo el sistema del que hay una instancia para todos los clientes. Un "agente" de "agente" es un servicio que se ejecuta por usuario. Los demonios no deben intentar mostrar la interfaz de usuario o interactuar directamente con la sesión de inicio de sesión de un usuario. de un usuario. Todo el trabajo que implique interactuar con un usuario debe realizarse a través de agentes.

En http://developer.apple.com/library/mac/#technotes/tn2083/_index.html :

Daemons y agentes, conocidos colectivamente como bac programas que operan sin interfaz gráfica de usuario. [ ] desarrollador, puede utilizar programas en segundo plano para realizar acciones sin interacción del usuario, y también para gestionar un estado compartido entre múltiples otros programas.

La diferencia entre un agente y un daem mostrar GUI si quiere, mientras que un daemon no puede. La diferencia entre un agente y una aplicación normal es que un agente típicamente no muestra GUI (o una GUI muy limitada).

El demonio/agente se describe en un archivo XML con extensión plist. Una de las condiciones que se pueden controlar es cambios en una carpeta . Esto será muy útil.

Bien, ensuciémonos las manos:

Digamos que estas son las 2 carpetas donde tú y tu amigo guardáis vuestros archivos:

/tmp/folderstuart
/tmp/folderstuartsfriend

y esta es la carpeta común para la aplicación:

/tmp/folder

Queremos supervisar las dos rutas anteriores y sincronizar su contenido con /tmp/folder .

Este es el plist que hace lo que necesitamos:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>notesfoldersync</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/rsync</string>
        <string>-aE</string>
        <string>--delete</string>
        <string>--exclude='.*'</string>
        <string>/tmp/folderstuart/</string>
        <string>/tmp/folderstuartsfriend/</string>
        <string>/tmp/folder</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/tmp/folderstuart</string>
        <string>/tmp/folderstuartsfriend</string>
    </array>
    <key>ThrottleInterval</key>
        <integer>10</integer>
</dict>
</plist>

El plist controla las dos carpetas con clave WatchPaths (véase http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html#//apple_ref/doc/uid/10000172i-SW7-SW8 ).

Sugiero el programa rsync para sincronizar carpetas. Opción --delete garantiza que los archivos eliminados en las carpetas supervisadas también se eliminen en /tmp/folder . Otras opciones son -aE para copiar atributos HFS+ estándar y extendidos, y --exclude='.*' saltar .localized , .DS_Store y otros archivos ocultos.

He añadido ThrottleInterval en caso de que desee establecer el intervalo mínimo en el que se puede generar un trabajo. El valor predeterminado es 10 s, es decir, los trabajos no se generarán más de una vez cada 10 segundos.

Guarde el plist (véase man launchd para obtener una lista de posibles rutas) como:

 /System/Library/LaunchDaemons/notesfoldersync.plist

Crear:

/tmp/folderstuart
/tmp/folderstuartsfriend
/tmp/folder

y cargar (es decir, habilitar) el plist:

sudo launchctl load /System/Library/LaunchDaemons/notesfoldersync.plist

Ahora cree un archivo en /tmp/folderstuart :

touch /tmp/folderstuart/file.txt

y observa cómo se produce la magia: file.txt se creará en cuestión de segundos en /tmp/folder . Elimínelo y desaparecerá de /tmp/folder . También sincronizará los archivos creados o eliminados en /tmp/folderstuartsfriend .

Observa que esta solución no gestiona las colisiones de nombres. Si no puede asegurar que los archivos se nombrarán de forma diferente sustituya rsync por un script que rsyncs y comprueba el nombre de los archivos para evitar la pérdida de datos.

Si copiar archivos no es una opción, sustitúyalo por rsync con un script que crea hardlinks (si ambos archivos están en el mismo sistema de archivos yo recomendaría hardlinks en lugar de symlinks). Antes de cambiar el plist descargalo:

sudo launchctl unload /System/Library/LaunchDaemons/notesfoldersync.plist

Cuando termines, vuelve a cargarlo.

1voto

Eddie Deyo Puntos 2416

¿Por qué no utilizar una palabra clave o un comentario de Spotlight para etiquetar los archivos de cada carpeta y, a continuación, una carpeta inteligente para mostrarlos juntos?

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