Chcę obejrzeć folder na moim komputerze Mac (Snow Leopard), a następnie wykonać skrypt (podając nazwę pliku, który został właśnie przeniesiony do folderu (jako parametr ... x.sh „nazwa pliku”)).
Mam skrypt napisany w bash (x.sh), który przeniesie niektóre pliki i inne rzeczy na wejściu 1 $ Potrzebuję tylko OSX, aby podać nazwę pliku, gdy nowe pliki / foldery zostaną przeniesione / utworzone do katalogu.
Jakieś takie polecenie?
fswatch
przedstawione jako odpowiedź w rzeczywistości korzysta z tej metody.Odpowiedzi:
fswatch
fswatch to mały program wykorzystujący interfejs API Mac OS X FSEvents do monitorowania katalogu. Po odebraniu zdarzenia dotyczącego jakiejkolwiek zmiany w tym katalogu, określone polecenie powłoki jest wykonywane przez
/bin/bash
Jeśli korzystasz z systemu GNU / Linux, inotifywatch (część
inotify-tools
pakietu w większości dystrybucji) zapewnia podobną funkcjonalność.Aktualizacja:
fswatch
można teraz używać na wielu platformach, w tym BSD, Debian i Windows.Składnia / prosty przykład
Nowy sposób, w jaki można oglądać wiele ścieżek - dla wersji 1.xi nowszych :
Starszy sposób na wersje 0.x :
Instalacja z Homebrew
Od 9.12.2013 został ponownie dodany do homebrew - tak! Zaktualizuj więc listę formuł (
brew update
), a wszystko, co musisz zrobić, to:Instalacja bez Homebrew
Wpisz te polecenia w
Terminal.app
Jeśli nie masz
c
kompilatora w systemie, może być konieczne zainstalowanie narzędzi wiersza polecenia Xcode lub Xcode - oba są bezpłatne. Jeśli tak jest, prawdopodobnie powinieneś po prostu sprawdzić homebrew .Dodatkowe opcje dla
fswatch
wersji 1.xźródło
make
zgłasza błąd dotyczący nie znalezienia pliku makefile. Na szczęście fswatch jest teraz na MacPorts, więcsudo port install fswatch
działa, dla tych z nas, którzy używają MacPorts zamiast Homebrew.fswatch ./ | xargs -I{} cp {} ~/Dropbox/backup/latest/
fswatch .
będziesz monitorować bieżący katalog.fswatch -0 -v -o /path/to/watched/files | xargs -0 -n 1 -I {} [your command]
ze-0
dla wartości null. Ten działa dla mnie na mniejszą kompilacjęMożesz użyć do tego celu uruchomionego . Uruchomione można skonfigurować tak, aby automatycznie uruchamiało program po zmodyfikowaniu ścieżki pliku.
Na przykład następujący plist uruchomionej konfiguracji uruchomi program,
/usr/bin/logger
gdy folder pulpitu mojego konta użytkownika zostanie zmodyfikowany:Aby aktywować plist konfiguracji, zapisz go w folderze LaunchAgents w folderze Library jako „logger.plist”.
Z poziomu powłoki możesz następnie użyć polecenia,
launchctl
aby aktywować logger.plist, uruchamiając:Folder na pulpicie jest teraz monitorowany. Za każdym razem, gdy jest zmieniany, powinieneś zobaczyć wynik w pliku system.log (użyj Console.app). Aby dezaktywować logger.plist, uruchom:
W powyższym pliku konfiguracyjnym jest używana
WatchPaths
opcja. Możesz też użyć tejQueueDirectories
opcji. Aby uzyskać więcej informacji, zobacz stronę podręcznika uruchomionego .źródło
/usr/bin/logger
ze skryptem Bash i usunąłem"<string>path modified</strong>"
wpis, nie mogłem znaleźć sposobu, aby mój skrypt bash wiedział, który plik na pulpicie został zmodyfikowany - po prostu zdarzenie miało miejsce. Próbowałem patrząc$0
,$1
i tylko dostał nazwę skryptu sam, zauważając, przeszedł do niego.Strażnik Facebooka , dostępny za pośrednictwem Homebrew, również wygląda ładnie. Obsługuje również filtrowanie:
Zauważ, że ścieżka musi być bezwzględna.
źródło
Możesz rzucić okiem (a może rozwinąć) moje małe narzędzie
kqwait
. Obecnie po prostu siedzi i czeka na zdarzenie zapisu w jednym pliku, ale architektura kqueue pozwala na hierarchiczne układanie zdarzeń ...źródło
fswatch
(co też jest w porządku, ponieważ jest to tak lekkie opakowanie, że można go również zmodyfikować, aby zrobić właściwą rzecz, jestem pewien), gdzie będzie się uruchamiał podczas uruchamiania takich rzeczygit status
(które są faktycznie uruchamiane za każdym razem zsh monit jest renderowany na mojej maszynie ...) co właściwie trochę psuje ten skomplikowany skrypt, który mam, tworząc nieskończoną pętlę sprzężenia zwrotnego. kqwait dostarcza jednak informacji o zmienionym pliku i nie jest wyzwalany przezgit status
. Potrzebuję go jednak do odpalenia podczas pisania.$ brew install kqwait && while true; do kqwait doc/my_file.md; make; done
watchdog to wieloplatformowy API Pythona do oglądania plików / katalogów i ma wbudowane narzędzie „sztuczek”, 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).
źródło
Jest to tylko wzmianka o entr jako alternatywie w OSX do uruchamiania dowolnych poleceń w przypadku zmiany plików. Uważam to za proste i przydatne.
źródło
Oto jeden-liner używając
sschober
„s narzędzie .źródło
$ brew install kqwait
Edycja:
fsw
zostało połączonefswatch
. W tej odpowiedzifsw
należy teraz przeczytać wszelkie odniesienia dofswatch
.Napisałem
fswatch
zamiennik w C ++ o nazwie,fsw
który zawiera kilka ulepszeń:Jest to projekt GNU Build System, który opiera się na dowolnej obsługiwanej platformie (OS X v.> = 10.6) z
Wiele ścieżek można przekazać jako różne argumenty:
Zrzuca szczegółowy zapis ze wszystkimi informacjami o zdarzeniu, takimi jak:
Jego dane wyjściowe można łatwo przeanalizować, dzięki czemu
fsw
dane wyjściowe można skierować do innego procesu.-l, --latency
.-n, --numeric
.strftime
ciągów formatu za pomocą-t, --time-format
.-u, --utc-time
.Pierwsze fsw:
fsw
jest hostowany na GitHub i można go uzyskać klonując jego repozytorium:Instalowanie fsw:
fsw
można zainstalować za pomocą następujących poleceń:Dalsza informacja:
Napisałem również wstępny post na blogu, w którym można znaleźć kilka przykładów na temat tego, jak
fsw
działa.źródło
Akcje folderów Apple OSX pozwalają zautomatyzować zadania na podstawie akcji podjętych w folderze.
źródło
Mój widelec fswatch zapewnia funkcjonalność
inotifywait -m
z nieco mniejszym (nie czekaj, więcej! Mam dużo więcej problemów w Linuksie zinotifywait
...) wyjściem przyjaznym dla parsowania.Jest to ulepszenie w stosunku do oryginału
fswatch
ponieważ wysyła rzeczywistą ścieżkę zmienionego pliku za pośrednictwem STDOUT, zamiast wymagać dostarczenia programu, który rozwiąże.Jest solidny jak fundament serii przerażających skryptów bashowych, których używam do automatyzacji rzeczy.
(jest to nie na temat)
inotifywait
w Linuksie, z drugiej strony, wymaga dużo kłopotów na nim, a ja wciąż nie wymyśliłem dobrego sposobu zarządzania, chociaż myślę, że coś opartegonode.js
może być biletem.źródło
brew install https://raw.github.com/mlevin2/homebrew/116b43eaef08d89054c2f43579113b37b4a2abd3/Library/Formula/fswatch.rb
Mam do tego GIST, a użycie jest dość proste
Aby to zilustrować, następujące polecenie będzie powtarzane przy
Hello World
każdej zmianiefile1
LUBfile2
; a domyślna kontrola interwału to 1 sekundaJeśli chcę sprawdzać co 5 sekund, mogę użyć
-t
flagi-v
włączaverbose
tryb, który wyświetla informacje debugowania-q
powodujewatchfiles
wykonanie po cichu (#
zostanie pokazane, aby użytkownik mógł zobaczyć, że program się wykonuje)-qq
sprawia, żewatchfiles
wykonanie jest całkowicie ciche-h
pokazuje pomoc i użyciehttps://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55
źródło
Skończyło się to na macOS. Jestem pewien, że jest to okropne na wiele sposobów:
źródło
Jeśli chcesz korzystać z NodeJS, możesz użyć pakietu o nazwie chokidar (lub chokidar-cli faktycznie ) do oglądania, a następnie użyć
rsync
(dołączonego do Maca):Komenda Rsync:
$ rsync -avz --exclude 'some-file' --exclude 'some-dir' './' '/my/destination'
Chokidar cli (instalowany globalnie przez npm):
chokidar \"**/*\" -c \"your-rsync-command-above\"
źródło
Oto prosta alternatywa dla pojedynczej linii dla użytkowników, którzy nie mają
watch
polecenia, którzy chcą wykonać polecenie co 3 sekundy:while :; do your-command; sleep 3; done
Jest to nieskończona pętla, która jest zasadniczo taka sama, jak wykonywanie następujących czynności:
watch -n3 your-command
źródło
your-command
jest dysk I / O, to jest to gwarantowany dysk do odczytu / zapisu co 3 sekundy - lub 10 800 razy co godzinę. Używając zdarzeń systemu plików masz gwarancję, że operacje we / wy (i inne kosztowne operacje) będą miały miejsce tylko wtedy, gdy zmienisz plik (co zwykle trwa tylko kilka razy na godzinę).watch
rzeczy, aby zobaczyć, co się dzieje. Nie używam wspomnianej techniki w aplikacjach produkcyjnych ani nic podobnego. Na przykład chciałbym zobaczyć postępdd
, a moja technika sprawia, że tak się dzieje (zastępującyour-command
odpowiednio, aby wysłać odpowiedni sygnałdd
).