Vreau sa ma uit la un folder de pe Mac-ul meu (Snow Leopard) și apoi executa un script (dându-i numele ce-a fost tocmai s-a mutat într-un folder (ca un parametru... x.sh "nume")).
Am un script scris în bash (x.sh), care se va muta unele fișiere și alte chestii pe intrare $1 am nevoie doar de OSX să-mi dea nume de fișier atunci când noi fișiere/foldere sunt mutate/creat într-un dir.
Orice astfel de comanda?
fswatch este un mic program care utilizează Mac OS X FSEvents API pentru a monitoriza un director.
Atunci când un eveniment despre orice schimbare la care director este primit, specificate
shell comanda este executat de /bin/bash
Daca're pe GNU/Linux, inotifywatch (parte a `inotify-instrumente pachet pe majoritatea distribuțiilor) oferă similare funcționalitate.
Actualizare: fswatch
poate fi acum folosit pe mai multe platforme, inclusiv BSD, Debian, și Windows.
Noul mod în care se poate viziona mai multe căi - pentru versiuni 1.x și mai mare:
fswatch -o ~/path/to/watch | xargs -n1 -I{} ~/script/to/run/when/files/change.sh
Notă: numărul de ieșire de
-o
vor fi adăugate la sfârșitul anilorxargs
comanda daca nu-am{}
. Dacă alegeți să utilizați acest număr, loc{}
oriunde in comanda ta.
Cel mai vechi mod de versiuni 0.x:
fswatch ~/path/to/watch ~/script/to/run/when/files/change.sh
Ca de 9/12/13 a fost adăugat înapoi în a homebrew - yay! Deci, actualizați lista de formule (fiertură de actualizare "a") și apoi, tot ce trebuie sa faci este:
brew install fswatch
Tipul de aceste comenzi în Terminal.app`
cd /tmp
git clone https://github.com/alandipert/fswatch
cd fswatch/
make
cp fswatch /usr/local/bin/fswatch
Dacă tu nu't au un " c " compiler în sistemul dumneavoastră, ați putea avea nevoie pentru a instala Xcode sau Xcode instrumente de linie de comandă - ambele gratuite. Cu toate acestea, în cazul în care este cazul, ar trebui, probabil, doar a a verifica afară homebrew.
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.
Puteți utiliza launchd pentru acest scop. Launchd poate fi configurat pentru a lansa în mod automat de un program atunci când o cale de fișier este modificat.
De exemplu, următoarele launchd config plist va lansa programul `/usr/bin/logger când folderul desktop de contul meu de utilizator este modificat:
<?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>
Pentru a activa config plist salvați-l la LaunchAgents folder în folderul Library ca "logger.plist".
De coajă apoi puteți folosi comanda launchctl
pentru a activa logger.plist de funcționare:
$ launchctl load ~/Library/LaunchAgents/logger.plist
Folderul desktop este acum monitorizat. De fiecare dată când este schimbat ar trebui să vedeți o ieșire în sistem.log (utilizați Consola.app). Pentru a dezactiva logger.plist, a alerga:
$ launchctl unload ~/Library/LaunchAgents/logger.plist
Fișierul de configurare de mai sus folosește WatchPathsopțiune. Alternativ, puteți utiliza, de asemenea,
QueueDirectories` opțiune. Vezi launchd pagina man pentru mai multe informații.
Facebook's paznicul, disponibil prin intermediul Homebrew, de asemenea, arata frumos. Aceasta susține, de asemenea, de filtrare:
Aceste două linii se stabilească un ceas pe o sursă de director, și apoi setați un trigger numit "buildme", care va rula un instrument numit "minify-css" ori de câte ori un fișier CSS este schimbat. Instrumentul va fi trecut pe o listă de s-a schimbat numele de fișiere.
$ paznic de ceas ~/src
$ paznic -- declanșa ~/src buildme '*.css' -- minify-css
Observați că drumul trebuie să fie absolută.
watchdog este un cross-platform API python pentru vizionarea de fișiere / directoare, și a interna "trucuri" instrument care vă permite pentru a declanșa acțiuni (inclusiv comenzi shell), atunci când apar evenimente (inclusiv noi adăugate în fișier, a eliminat fișierul și-a schimbat fișier).
Edit: fsw a fost fuzionat în [
fswatch][fswatch]. În acest răspuns, orice referire la
fswar trebui acum să citesc fswatch
.
Am scris un fswatch
înlocuire în C++ numit fsw
care dispune de mai multe imbunatatiri:
./configure && make && sudo make install
fsw fișier-0 ... file-n
Sat Feb 15 00:53:45 2014 - /path/to/file:inodeMetaMod modificat isFile
-l, --latenta
.-n, --numeric
.strftime
format siruri de caractere cu -t, --timp-format
.-u, --utc-timp
.Obtinerea fsw:
fsw
este găzduit pe GitHub și pot fi obținute de clonare sale depozit:
git clone https://github.com/emcrisostomo/fsw
Instalarea fsw:
`fsw poate fi instalat folosind următoarele comenzi:
./configura && face && sudo make install
Informații suplimentare:
Am scris, de asemenea, un curs introductiv blog în cazul în care puteți găsi o serie de exemple despre cum fsw` funcționează.
Furculița de fswatch oferă funcționalitatea de inotifywait -mcu mai puțin (nu, stai, mai! Am mult mai multe probleme pe Linux cu inotifywait
...) analiza-friendly de ieșire.
Este o îmbunătățire pe original fswatch
deoarece transmite efectiv calea de fișier schimbat peste STDOUT mai degrabă decât să solicite să furnizați un program care se bifurca.
L's rock solid ca fundament o serie de înfricoșător bash script-uri am folosit pentru a automatiza lucruri.
(asta e off-topic) inotifywait pe Linux, pe de altă parte, necesită o mulțime de "făcăturile" pe partea de sus a acesteia și încă nu m-am't dat seama o modalitate buna de a gestiona, deși cred că ceva bazat pe node.js
ar putea fi biletul.
Am un GIST pentru acest lucru și de utilizare este destul de simplu
watchfiles <cmd> <paths...>
Pentru a ilustra, comanda următoare va echo "Lumea Bună" de fiecare dată că file1 " SAU " file2
schimbare; și implicit intervalul de control este de 1 secundă
watchfiles 'echo Hello World' /path/to/file1 /path/to/file2
Dacă vreau să verificați la fiecare 5 secunde pot folosi -t
pavilion
watchfiles -t 'echo Hello World' /path/to/file1 /path/to/file2
-v
permite detaliat
modul în care arată informații de depanare-q
face watchfiles
executa în liniște (#
va fi afișat astfel încât utilizatorul poate vedea programul este de executare)-qq
face watchfiles
executa complet în liniște-h
arată ajuta și de utilizarehttps://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55
Dacă doriți să utilizați NodeJS, puteți utiliza un pachet numit chokidar (sau chokidar-cli de fapt) pentru vizionarea și de a folosi apoi rsync
(inclus cu Mac):
Comanda Rsync:
$ rsync -avz --exclude 'un dosar' --exclude 'unele-dir' './' '/meu/destinație'
Chokidar cli (instalate la nivel global prin intermediul npm):
chokidar \"**/*\" -c \"ta-rsync-comanda-de mai sus\"
Am ajuns să fac acest lucru pentru macOS. Am'sunt sigur că acest lucru este teribil în mai multe moduri:
#!/bin/sh
# watchAndRun
if [ $# -ne 2 ]; then
echo "Use like this:"
echo " $0 filename-to-watch command-to-run"
exit 1
fi
if which fswatch >/dev/null; then
echo "Watching $1 and will run $2"
while true; do fswatch --one-event $1 >/dev/null && $2; done
else
echo "You might need to run: brew install fswatch"
fi
Aici's un simplu singură linie alternativă pentru utilizatorii care nu't au "ceas", comanda care doresc să execute o comandă la fiecare 3 secunde:
în timp ce :; facă-ți-comandă; dormi 3; face
L's-o buclă infinită care este în esență același ca face următoarele:
uita -n3 ta-comanda