Cómo crear una carpeta inteligente como una carpeta física con el contenido combinado de dos carpetas

2

Tengo una aplicación que busca sus archivos 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 vea los archivos de datos de texto como residentes en una carpeta (que contiene los dos conjuntos de archivos).

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

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

La solución tendría que lidiar con el caso de conflictos de nombres de archivos de una manera sensata.

    
pregunta Stuart Woodward 03.10.2012 - 12:53

2 respuestas

7

Puedes usar launchd .

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

¿Qué son los demonios y los agentes?

Desde man launchd :

  

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

De enlace :

  

Los demonios y agentes, conocidos colectivamente como programas de fondo, son   Programas que operan sin ninguna interfaz gráfica de usuario. Como un   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 demonio es que un agente puede   mostrar GUI si quiere, mientras que un demonio no puede. La diferencia   entre un agente y una aplicación regular es que un agente normalmente   no muestra GUI (o una GUI muy limitada).

El daemon / agent se describe en un archivo XML con la extensión plist. Una de las condiciones que se pueden monitorear es cambios en una carpeta . Esto será útil.

Está bien, ensuciémonos las manos:

Digamos que estas son las 2 carpetas donde usted y su amigo guardan sus archivos:

/tmp/folderstuart
/tmp/folderstuartsfriend

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

/tmp/folder

Queremos monitorear las dos rutas anteriores y sincronizar sus contenidos 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 supervisa las dos carpetas con la clave WatchPaths (consulte enlace ).

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

Agregué ThrottleInterval en caso de que quiera establecer el intervalo mínimo para 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 (vea man launchd para una lista de posibles rutas) como:

 /System/Library/LaunchDaemons/notesfoldersync.plist

Crear:

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

y cargue (es decir, habilite) el plist:

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

Ahora crea un archivo en /tmp/folderstuart :

touch /tmp/folderstuart/file.txt

y observe cómo sucede la magia: file.txt se creará en segundos en /tmp/folder . Bórralo y desaparecerá de /tmp/folder . También sincronizará los archivos creados o eliminados en /tmp/folderstuartsfriend .

¡Observe que esta solución no maneja las colisiones de nombres! Si no puede asegurarse de que los archivos se nombren de manera diferente, sustituya rsync con un script que rsyncs y hace verificación de nombres para evitar la pérdida de datos.

Si copiar archivos no es una opción, sustituya rsync con un script que cree enlaces físicos (si ambos archivos están en el mismo sistema de archivos, recomendaría enlaces físicos en lugar de enlaces simbólicos). Antes de cambiar el plist descargalo:

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

Cuando hayas terminado, cárgalo de nuevo.

    
respondido por el jaume 19.10.2012 - 15:59
1

¿Por qué no usar una palabra clave o un comentario de Spotlight para etiquetar los archivos en cada carpeta y luego una carpeta inteligente para mostrarlos juntos?

    
respondido por el terrydev 20.10.2012 - 21:49

Lea otras preguntas en las etiquetas