Monitore uma pasta para alterações e execute um comando quando uma alteração for detectada

10

Existe uma maneira simples de executar automaticamente um comando (Terminal) toda vez que um arquivo é alterado em uma pasta específica?

Isso deve ser possível por meio da linha de comando ou de um aplicativo interno do sistema, sem aplicativos de terceiros.

Alguma ideia?

Louis B.
fonte

Respostas:

6

Salve uma lista de propriedades como esta como ~/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>

O agente pode ser carregado com launchctl load ~/Library/LaunchAgents/test.plistou efetuando logout e logon novamente. A aplicação de alterações requer descarregar e carregar o plist.

A expansão til ( ~/) funciona nos WatchPaths por padrão. EnableGlobbing adiciona expansão curinga e til para ProgramArguments, mas não afeta o Program ou o WatchPaths.

Se um arquivo monitorado for modificado dentro de dez segundos a partir da última chamada, uma mensagem como esta será adicionada ao system.log:

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

Uma maneira de se livrar das mensagens é adicionar algo como sleep 10ao final dos scripts. Definir ThrottleInterval para 10 não ajuda.

Alterações nas subpastas das pastas monitoradas não são detectadas.

Veja man launchde man launchd.plistpara mais informações.

Lri
fonte
5

entr (1) é um utilitário para executar comandos quando os arquivos são alterados. Ele lê uma lista de arquivos no STDIN e usa o kqueue (2) para evitar pesquisas.

Exemplo:

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

Você pode usar as Ações da pasta, que permitem executar scripts (Automator) sempre que o conteúdo de uma pasta for alterado. Tanto quanto sei, o Automator possui um modelo que permite criar facilmente uma nova ação de pasta e anexá-la à pasta desejada. E adicionando uma ação "Executar script de shell", você deve obter o efeito desejado.

xeophin
fonte
5
Obrigado, mas parece que "Ações da pasta" são acionadas apenas quando um arquivo é adicionado à pasta, não quando um arquivo existente é verificado.
Louis B.
3

As ações da pasta são boas para acionar quando um arquivo é adicionado ou modificado.

No entanto, se sua definição de alteração inclui a exclusão de um arquivo, as ações da Pasta OSX não detectam se um arquivo foi removido.

Para responder à pergunta:

  1. Faça o download das dependências do FileWatcher aqui: https://github.com/eonist/swift-utils

  2. Familiarize-se com a execução rápida na linha de comando: http://krakendev.io/blog/scripting-in-swift

  3. Use este código para assistir a uma pasta.

Código:

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
}
eonista
fonte
1

O Automator possui um tipo de fluxo de trabalho chamado "Ação da pasta", que é executado automaticamente quando algo é adicionado a uma pasta. Crie um e use a ação "Executar script do shell".

Timothy Mueller-Harder
fonte
4
Obrigado, mas parece que "Ações da pasta" são acionadas apenas quando um arquivo é adicionado à pasta, não quando um arquivo existente é verificado.
Louis B.
Ah, tudo bem. Desculpa.
Timothy Mueller-Harder
0

Você pode tentar algo assim:

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
Holger von Ameln
fonte
Você também precisa ls -lcapturar alterações no arquivo.
Nohillside
direito .... perdi isso
Holger von Ameln