Monitoruj folder pod kątem zmian i uruchom polecenie po wykryciu zmiany


10

Czy istnieje prosty sposób automatycznego uruchamiania polecenia (Terminal) za każdym razem, gdy plik jest zmieniany w określonym folderze?

Powinno to być możliwe za pośrednictwem wiersza polecenia lub aplikacji wbudowanej w system, bez aplikacji innych firm.

Jakieś pomysły?



Odpowiedzi:


6

Zapisz listę nieruchomości w następujący sposób ~/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>

Agenta można załadować launchctl load ~/Library/LaunchAgents/test.plistlub wylogować się i zalogować ponownie. Zastosowanie zmian wymaga rozładowania i załadowania listy odtwarzania.

Rozbudowa tyldy ( ~/) domyślnie działa w WatchPaths. EnableGlobbing dodaje rozszerzenie symboli wieloznacznych i tyldy dla ProgramArguments, ale nie wpływa na Program ani WatchPaths.

Jeśli obserwowany plik zostanie zmodyfikowany w ciągu dziesięciu sekund od ostatniego wywołania, komunikat taki jak ten zostanie dodany do system.log:

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

Jednym ze sposobów na pozbycie się wiadomości jest dodanie czegoś sleep 10na końcu skryptu. Ustawienie ThrottleInterval na 10 nie pomaga.

Zmiany w podfolderach obserwowanych folderów nie są wykrywane.

Zobacz man launchdi man launchd.plistwięcej informacji.


6

entr (1) to narzędzie do uruchamiania poleceń w przypadku zmiany plików. Czyta listę plików na STDIN i używa kqueue (2), aby uniknąć odpytywania.

Przykład:

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

3

Możesz użyć akcji folderu, która pozwala wykonywać skrypty (Automator) przy każdej zmianie zawartości folderu. O ile mi wiadomo, Automator ma szablon, który pozwala łatwo utworzyć nową akcję folderu i dołączyć ją do żądanego folderu. Dodając akcję „Uruchom skrypt powłoki”, powinieneś uzyskać pożądany efekt.


5
Dzięki, ale wygląda na to, że „akcje folderu” są uruchamiane tylko wtedy, gdy plik jest dodawany do folderu, a nie podczas sprawdzania istniejącego pliku.
Louis B.

3

Akcje folderów nadają się do wyzwalania, gdy plik jest dodawany lub modyfikowany.

Jeśli jednak twoja definicja zmiany obejmuje usunięcie pliku, akcje folderu OSX nie wykrywają, czy plik został usunięty.

Aby odpowiedzieć na pytanie:

  1. Pobierz zależności FileWatcher stąd: https://github.com/eonist/swift-utils

  2. Zapoznaj się z bieganiem swift w linii poleceń: http://krakendev.io/blog/scripting-in-swift

  3. Użyj tego kodu, aby obejrzeć folder.

Kod:

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 ma typ przepływu pracy o nazwie „Akcja folderu”, który jest automatycznie uruchamiany, gdy coś zostanie dodane do folderu. Utwórz taki, a następnie użyj akcji „Uruchom skrypt powłoki”.


4
Dzięki, ale wygląda na to, że „akcje folderu” są uruchamiane tylko wtedy, gdy plik jest dodawany do folderu, a nie podczas sprawdzania istniejącego pliku.
Louis B.

W porządku Przepraszam.
Timothy Mueller-Harder

0

Możesz spróbować czegoś takiego:

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

Musisz przynajmniej ls -lzłapać zmiany plików.
nohillside

racja .... przegapiłem
Holger von Ameln
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.