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?



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.


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"

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.


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
}

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".


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

Você também precisa ls -lcapturar alterações no arquivo.
Nohillside

direito .... perdi isso
Holger von Ameln
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.