Come creare una cartella Smart come una cartella fisica con il contenuto combinato di due cartelle

2

Ho un'applicazione che cerca i suoi file di dati (* .txt) in una cartella. Ho due cartelle contenenti dati di testo che devo tenere separati, ma sarebbe utile che l'applicazione veda i file di testo come residenti in una cartella (contenente i due set di file).

Posso creare uno script che mantiene collegamenti simbolici ai file nelle due cartelle in una terza cartella combinata.

Piuttosto che reinventare la ruota, mi piacerebbe utilizzare una soluzione comprovata, se possibile.

La soluzione avrebbe dovuto affrontare il caso di scontri tra nomi di file in modo sensato.

    
posta Stuart Woodward 03.10.2012 - 12:53
fonte

2 risposte

7

Potresti usare launchd .

launchd ti consente di gestire daemon e agenti in base a determinate condizioni.

Che cosa sono i demoni e gli agenti?

Da man launchd :

A "daemon" is, by definition, a system-wide service of which there is one instance for all clients. An "agent" is a service that runs on a per-user basis. Daemons should not attempt to display UI or interact directly with a user's login session. Any and all work that involves interacting with a user should be done through agents.

Da link :

Daemons and agents, collectively known as background programs, are programs that operate without any graphical user interface. As a developer, you can use background programs to perform actions without user interaction, and also to manage a shared state between multiple other programs.

The difference between an agent and a daemon is that an agent can display GUI if it wants to, while a daemon can't. The difference between an agent and a regular application is that an agent typically displays no GUI (or a very limited GUI).

Il daemon / agente è descritto in un file XML con estensione plist. Una delle condizioni che è possibile monitorare è modifiche in una cartella . Questo sarà utile.

OK, sporcarci le mani:

Diciamo che queste sono le 2 cartelle in cui tu e il tuo amico tenete i vostri file:

/tmp/folderstuart
/tmp/folderstuartsfriend

e questa è la cartella comune per l'applicazione:

/tmp/folder

Vogliamo monitorare i due percorsi sopra e sincronizzare i loro contenuti con /tmp/folder .

Questo è il plist che fa ciò di cui abbiamo bisogno:

<?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>

Il plist controlla le due cartelle con la chiave WatchPaths (vedi link ).

Suggerisco il programma rsync per sincronizzare le cartelle. L'opzione --delete garantisce che anche i file eliminati nelle cartelle monitorate vengano eliminati in /tmp/folder . Altre opzioni sono -aE per copiare gli attributi HFS + standard ed estesi e --exclude='.*' per saltare .localized , .DS_Store e altri file nascosti.

Ho aggiunto ThrottleInterval nel caso in cui desideri impostare l'intervallo minimo in cui un lavoro può essere generato. Il valore predefinito è 10 s, ovvero i lavori non verranno generati più di una volta ogni 10 secondi.

Salva il plist (vedi man launchd per un elenco di percorsi possibili) come:

 /System/Library/LaunchDaemons/notesfoldersync.plist

Crea:

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

e carica (cioè abilita) il plist:

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

Ora crea un file in /tmp/folderstuart :

touch /tmp/folderstuart/file.txt

e osserva la magia che si verifica: file.txt verrà creato in pochi secondi in /tmp/folder . Eliminalo e scomparirà da /tmp/folder . Sincronizza anche i file creati o eliminati in /tmp/folderstuartsfriend .

Si noti che questa soluzione non gestisce le collisioni di nomi! Se non è possibile garantire che i file vengano denominati in modo diverso, sostituisci rsync con uno script che rsyncs e esegue il file controllo del nome per evitare la perdita di dati.

Se copiare i file non è un'opzione, sostituisci rsync con uno script che crea i collegamenti fisici (se entrambi i file si trovano nello stesso file system, consiglierei i collegamenti fisici anziché i collegamenti simbolici). Prima di cambiare il plist, scaricalo:

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

Al termine, caricalo di nuovo.

    
risposta data 19.10.2012 - 15:59
fonte
1

Perché non utilizzare una parola chiave o un commento Spotlight per contrassegnare i file in ogni cartella e quindi una Smart Folder per visualizzarli insieme?

    
risposta data 20.10.2012 - 21:49
fonte

Leggi altre domande sui tag