Monitora una cartella per le modifiche ed esegue un comando quando viene rilevata una modifica

10

Esiste un modo semplice per eseguire automaticamente un comando (Terminale) ogni volta che un file viene modificato in una cartella specifica?

Questo dovrebbe essere possibile tramite la riga di comando o un'applicazione di sistema integrata, senza applicazioni di terze parti.

Qualche idea?

    
posta Louis B. 17.02.2012 - 10:01
fonte

6 risposte

6

Salva un elenco di proprietà come ~/Library/LaunchAgents/test.plist :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd>
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>test</string>
    <key>ProgramArguments</key>
    <array>
        <string>say</string>
        <string>yy</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>~/Desktop/</string>
    </array>
</dict>
</plist>

L'agente può essere caricato con launchctl load ~/Library/LaunchAgents/test.plist o disconnettendosi e rientrando. L'applicazione delle modifiche richiede lo scarico e il caricamento del plist.

L'espansione di Tilde ( ~/ ) funziona in WatchPath per impostazione predefinita. EnableGlobbing aggiunge l'espansione jolly e tilde per ProgramArguments, ma non influisce su Program o WatchPath.

Se un file guardato viene modificato entro dieci secondi dall'ultima chiamata, un messaggio come questo viene aggiunto a system.log:

com.apple.launchd.peruser.501[146]: (test) Throttling respawn: Will start in 7 seconds

Un modo per sbarazzarsi dei messaggi è aggiungere qualcosa come sleep 10 alla fine degli script. L'impostazione di ThrottleInterval su 10 non aiuta.

Le modifiche nelle sottocartelle delle cartelle guardate non vengono rilevate.

Visualizza man launchd e man launchd.plist per ulteriori informazioni.

    
risposta data 17.02.2012 - 15:02
fonte
5

entr (1) è un'utilità per l'esecuzione di comandi quando i file cambiano. Legge un elenco di file su STDIN e utilizza kqueue (2) per evitare il polling.

Esempio:

ls my_project/*.html | entr echo "file changed"
    
risposta data 04.07.2013 - 06:50
fonte
3

È possibile utilizzare Folder Actions, che consente di eseguire script (Automator) ogni volta che i contenuti di una cartella cambiano. Per quanto ne so, Automator ha un modello che ti consente di creare facilmente una nuova azione di cartella e collegarla alla cartella desiderata. E aggiungendo un'azione "Esegui Shell Script", dovresti ottenere l'effetto desiderato.

    
risposta data 17.02.2012 - 12:54
fonte
3

Le azioni della cartella vanno bene per l'attivazione quando un file viene aggiunto o modificato.

Tuttavia, se la definizione di modifica include l'eliminazione di un file, le azioni della cartella OSX non rilevano se un file è stato rimosso.

Per rispondere alla domanda:

  1. Scarica le dipendenze FileWatcher da qui: link

  2. Familiarizza con il comando rapido nella commandline: link

  3. Utilizza questo codice per guardare una cartella.

Codice:

var fileWatcher = FileWatcher(["~/Desktop/test/".tildePath])/*<---the fileWatcher instance must be scoped to your class*/

fileWatcher!.event = { event in
    Swift.print(self?.someVariable)//Outputs: a variable in your current class
    Swift.print(event.description)//Outputs: a description of the file change
}
    
risposta data 09.04.2016 - 12:33
fonte
1

Automator ha un tipo di flusso di lavoro chiamato "Azione cartella" che viene eseguito automaticamente quando qualcosa viene aggiunto a una cartella. Creane uno, quindi utilizza l'azione "Esegui Shell Script".

    
risposta data 17.02.2012 - 12:52
fonte
0

Potresti provare qualcosa di simile a questo:

touch /tmp/dirb.tmp
while true do 
  ls /thedirtocheck > /tmp/dira.tmp 
  diff /tmp/dira.tmp /tmp/dirb.tmp || echo "something changed" 
  cp /tmp/dira.tmp /tmp/dirb.tmp 
  sleep 100 
done
    
risposta data 17.02.2012 - 12:48
fonte

Leggi altre domande sui tag