Monitorare una cartella per le modifiche ed eseguire 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?

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

Qualche idea?



Risposte:


6

Salvare un elenco di proprietà come questo 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.plisto disconnettendosi e rientrando. L'applicazione delle modifiche richiede lo scarico e il caricamento del plist.

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

Se un file controllato 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 di simile sleep 10alla fine degli script. L'impostazione di ThrottleInterval su 10 non aiuta.

Le modifiche nelle sottocartelle delle cartelle controllate non vengono rilevate.

Vedi man launchde man launchd.plistper maggiori informazioni.


5

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

Esempio:

ls my_project/*.html | entr echo "file changed"

3

È possibile utilizzare Azioni cartella, che consente di eseguire script (Automator) ogni volta che il contenuto di una cartella cambia. Per quanto ne so, Automator ha un modello che consente di creare facilmente una nuova azione cartella e allegarla alla cartella desiderata. E aggiungendo un'azione "Esegui script shell", dovresti ottenere l'effetto desiderato.


5
Grazie, ma sembra che le "Azioni cartella" vengano attivate solo quando un file viene aggiunto alla cartella, non quando viene verificato un file esistente.
Louis B.

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 di FileWatcher da qui: https://github.com/eonist/swift-utils

  2. Familiarizza con la corsa rapida nella linea di comando: http://krakendev.io/blog/scripting-in-swift

  3. Usa 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
}

1

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


4
Grazie, ma sembra che le "Azioni cartella" vengano attivate solo quando un file viene aggiunto alla cartella, non quando viene verificato un file esistente.
Louis B.

Oh ok. Scusate.
Timothy Mueller-Harder,

0

Potresti provare qualcosa del genere:

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

È necessario almeno ls -lper rilevare anche le modifiche ai file.
Nohillside

giusto .... mancato quello
Holger von Ameln,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.