Czy na Macu jest polecenie "watch" lub "inotifywait"?

Chcę obejrzeć folder na moim Macu (Snow Leopard), a następnie wykonać skrypt (podając mu nazwę pliku tego, co zostało przeniesione do folderu (jako parametr... x.sh "filename")).

Mam skrypt napisany w bash (x.sh) to przeniesie niektóre pliki i inne rzeczy na wejściu $1 potrzebuję tylko OSX, aby dać mi nazwę pliku, gdy nowe pliki / foldery są przenoszone / tworzone do katalogu.

Jakieś takie polecenie?

Author: Kara, 2009-10-04

12 answers

Fswatch

Fswatch jest małym programem używającym API Mac OS X FSEvents do monitorowania katalogu. Gdy odbierane jest zdarzenie o jakiejkolwiek zmianie w tym katalogu, określone polecenie powłoki jest wykonywane przez /bin/bash

Jeśli jesteś na GNU / Linuksie, inotifywatch (część inotify-tools pakiet na większości dystrybucji) zapewnia podobne funkcjonalność.

Aktualizacja: fswatch może być teraz używany na wielu platformach, w tym NA BSD, Debianie i Okna.

Składnia / Prosty Przykład

Nowy sposób, który może oglądać wiele ścieżek-dla wersji 1.x i wyżej :

fswatch -o ~/path/to/watch | xargs -n1 ~/script/to/run/when/files/change.sh

Starszy sposób dla wersji 0.x :

fswatch ~/path/to/watch ~/script/to/run/when/files/change.sh

Instalacja z Homebrew

Od 9/12/13 został dodany z powrotem do homebrew - yay! Tak więc zaktualizuj swoją listę formuł (brew update) i wszystko, co musisz zrobić, to:

brew install fswatch

Instalacja Bez Homebrew

Wpisz te polecenia w Terminal.app

cd /tmp
git clone https://github.com/alandipert/fswatch
cd fswatch/
make
cp fswatch /usr/local/bin/fswatch

Jeśli nie masz kompilatora c w systemie może być konieczne zainstalowanie narzędzi Xcode lub Xcode-oba darmowe. Jednakże, jeśli tak jest, prawdopodobnie powinieneś po prostu sprawdzić homebrew.

Dodatkowe opcje dla fswatch wersji 1.x

Usage:
fswatch [OPTION] ... path ...

Options:
 -0, --print0          Use the ASCII NUL character (0) as line separator.
 -1, --one-event       Exit fsw after the first set of events is received.
 -e, --exclude=REGEX   Exclude paths matching REGEX.
 -E, --extended        Use exended regular expressions.
 -f, --format-time     Print the event time using the specified format.
 -h, --help            Show this message.
 -i, --insensitive     Use case insensitive regular expressions.
 -k, --kqueue          Use the kqueue monitor.
 -l, --latency=DOUBLE  Set the latency.
 -L, --follow-links    Follow symbolic links.
 -n, --numeric         Print a numeric event mask.
 -o, --one-per-batch   Print a single message with the number of change events.
                       in the current batch.
 -p, --poll            Use the poll monitor.
 -r, --recursive       Recurse subdirectories.
 -t, --timestamp       Print the event timestamp.
 -u, --utc-time        Print the event time as UTC time.
 -v, --verbose         Print verbose output.
 -x, --event-flags     Print the event flags.

See the man page for more information.
 358
Author: cwd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-27 08:12:55

Możesz użyć launchd do tego celu. Launchd można skonfigurować tak, aby automatycznie uruchamiał program po zmianie ścieżki pliku.

Na przykład następujący plik konfiguracyjny launchd uruchomi program /usr/bin/logger, gdy folder pulpitu mojego konta użytkownika zostanie zmodyfikowany:

<?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>logger</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/logger</string>
        <string>path modified</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Users/sakra/Desktop/</string>
    </array>
</dict>
</plist>

Aby aktywować plik konfiguracyjny, zapisz go w folderze LaunchAgents w folderze biblioteki jako " logger.plist".

Z powłoki można następnie użyć polecenia launchctl, Aby aktywować logger.plist po uruchomieniu:

$ launchctl load ~/Library/LaunchAgents/logger.plist

Folder pulpitu jest teraz monitorowany. Za każdym razem, gdy jest zmieniany, powinieneś zobaczyć wyjście w systemie.log (Użyj konsoli.app). Aby wyłączyć rejestrator.plist, run:

$ launchctl unload ~/Library/LaunchAgents/logger.plist

Powyższy plik konfiguracyjny używa opcji WatchPaths. Alternatywnie można również użyć QueueDirectories opcja. Więcej informacji można znaleźć na stronie man launchd.

 85
Author: sakra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-02 12:39:17

Facebook watchman , dostępny za pośrednictwem Homebrew, również wygląda ładnie. Obsługuje również filtrowanie:

Te dwie linie tworzą obserwację w katalogu źródłowym, a następnie ustawiają uruchamia WYZWALACZ o nazwie "buildme", który uruchomi narzędzie o nazwie "minify-css" za każdym razem, gdy plik CSS jest zmieniany. Narzędzie zostanie przekazane listę zmieniono nazwy plików.

$ watchman watch ~/src

$ watchman -- trigger ~/src buildme '*.css' -- minify-css

Zauważ, że ścieżka musi być absolutna.

 20
Author: Jakub Holý,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-07 08:33:19

Możesz rzucić okiem na (i może rozwinąć) moje małe narzędzie kqwait. Obecnie po prostu siedzi i czeka na zdarzenie write na jednym pliku, ale architektura kqueue pozwala na hierarchiczne układanie zdarzeń...

 19
Author: sschober,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-24 22:49:07

Watchdog jest wieloplatformowym API Pythona do śledzenia plików / katalogów i posiada wbudowane narzędzie "sztuczki", które pozwala na uruchamianie akcji (w tym poleceń powłoki), gdy wystąpią zdarzenia (w tym nowy dodany plik, usunięty plik i zmieniony plik).

 13
Author: gfxmonk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-11 13:00:22

Jest to tylko wzmianka entr jako alternatywa dla systemu OSX do uruchamiania dowolnych poleceń przy zmianie plików. Uważam to za proste i użyteczne.

 5
Author: Donny Winston,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-18 09:13:30

Apple OSX akcje folderów umożliwiają automatyzację zadań na podstawie działań podejmowanych w folderze.

 3
Author: Asaph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-09 00:10:36

Edytuj: fsw została połączona w fswatch. W tej odpowiedzi każde odniesienie do fsw powinno teraz brzmieć fswatch.

Napisałem fswatch zamiennik w C++ o nazwie fsw, który zawiera kilka ulepszeń:

  • Jest to projekt GNU Build System, który buduje się na dowolnej obsługiwanej platformie (OS X V. > = 10.6) z
    ./configure && make && sudo make install
    
  • Wiele ścieżek może być przekazywanych jako różne argumenty:

    fsw file-0 ... file-n 
    
  • Rzuca szczegółową zapisz wszystkie informacje o zdarzeniu, takie jak:

    Sat Feb 15 00:53:45 2014 - /path/to/file:inodeMetaMod modified isFile 
    
  • Jego wyjście jest łatwe do przetworzenia, dzięki czemu wyjście fsw może być przekierowane do innego procesu.

  • opóźnienie można dostosować za pomocą -l, --latency.
  • Numeryczne flagi zdarzeń mogą być zapisywane zamiast tekstowych za pomocą -n, --numeric.
  • format czasu można dostosować za pomocą strftime ciągów formatujących z -t, --time-format.
  • czas może być lokalny czas maszyny (domyślnie) lub czas UTC z -u, --utc-time.

Uzyskanie fsw:

fsw jest hostowany na Githubie i można go uzyskać klonując jego repozytorium:

    git clone https://github.com/emcrisostomo/fsw

Instalacja fsw:

fsw może być zainstalowany za pomocą następujących poleceń:

    ./configure && make && sudo make install

Dalsze informacje:

Napisałem również wpis wprowadzający na blogu, W Którym Znajdziesz kilka przykładów na to, jak działa fsw.

 3
Author: Enrico M. Crisostomo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-05 20:21:56

Oto jednolinijkowy za pomocą sschober'S Narzędzie .

$ while true; do kqwait doc/my_file.md; make; done
 3
Author: Joshua Cook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:36

Mój widelec fswatch zapewnia funkcjonalność inotifywait -m z nieco mniej (nie czekaj, więcej! Mam o wiele więcej problemów na Linuksie z inotifywait...) parse-friendly output.

Jest to ulepszenie w stosunku do oryginalnego fswatch, ponieważ wysyła rzeczywistą ścieżkę zmienionego pliku przez STDOUT, a nie wymaga podania programu, który rozwidla.

Był solidny jak skała jako podstawa serii strasznych skryptów Basha, których używam do automatyzacji rzeczy.

(to jest off-topic) inotifywait na Linuksie, z drugiej strony, wymaga dużo kludges na nim i nadal nie wymyślił dobry sposób, aby zarządzać nim, choć myślę, że coś na podstawie node.js może być bilet.

 2
Author: Steven Lu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-28 02:16:02

Mam do tego GIST i użycie jest dość proste

watchfiles <cmd> <paths...>

Aby zilustrować, następujące polecenie będzie echo Hello World za każdym razem, gdy file1 lub file2 zmieni się; a domyślnym sprawdzeniem interwału jest 1 sekunda

watchfiles 'echo Hello World' /path/to/file1 /path/to/file2 

Jeśli chcę sprawdzać co 5 sekund mogę użyć znacznika -t

watchfiles -t 'echo Hello World' /path/to/file1 /path/to/file2 
  • -v włącza tryb verbose, który wyświetla informacje o debugowaniu
  • -q sprawia, że watchfiles wykonują po cichu (# zostaną pokazane, aby użytkownik mógł zobaczyć, że program jest executing)
  • -qq sprawia, że watchfiles wykonują całkowicie po cichu
  • -h pokazuje pomoc i użycie

Https://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55

 1
Author: thiagoh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-05 07:45:25

Oto prosta alternatywa dla użytkowników, którzy nie mają polecenia watch, którzy chcą wykonywać polecenie co 3 sekundy:

while :; do your-command; sleep 3; done

Jest to nieskończona pętla, która jest w zasadzie taka sama jak wykonywanie następujących czynności:

watch -n3 your-command

 -1
Author: trusktr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-11 08:39:08