Saya ingin menonton sebuah folder di my Mac (Snow Leopard) dan kemudian menjalankan script (memberikan nama file dari apa yang baru saja pindah ke sebuah folder (sebagai parameter.... x.sh "file")).
Saya memiliki script yang semua tertulis dalam bash (x.sh) yang akan memindahkan beberapa file dan hal-hal lain pada input $1 saya hanya perlu OSX untuk memberikan nama file baru file/folder yang dipindahkan/dibuat menjadi dir.
Setiap perintah seperti itu?
fswatch adalah sebuah program kecil yang menggunakan Mac OS X FSEvents API untuk memantau direktori.
Ketika sebuah peristiwa tentang perubahan ke direktori yang diterima, ditentukan
shell perintah dijalankan oleh /bin/bash
Jika anda're pada GNU/Linux,
inotifywatch (bagian dari
inotify-alat
paket pada kebanyakan distro) menyediakan mirip
fungsi.
Update: fswatch
sekarang dapat digunakan di banyak platform termasuk BSD, Debian, dan Windows.
Cara baru yang dapat menonton beberapa jalur - untuk versi 1.x dan lebih tinggi:
fswatch -o ~/path/to/watch | xargs -n1 -I{} ~/script/to/run/when/files/change.sh
Catatan: jumlah output
-o
akan ditambahkan ke akhir darixargs
perintah jika tidak untukaku{}
. Jika anda memilih untuk menggunakan nomor itu, tempat{}
di mana saja di perintah anda.
Tua cara untuk versi 0.x:
fswatch ~/path/to/watch ~/script/to/run/when/files/change.sh
Sebagai 9/12/13 itu ditambahkan kembali ke homebrew - yay! Jadi, update rumus anda daftar (minuman update
) dan kemudian semua yang perlu anda lakukan adalah:
brew install fswatch
Ketik perintah ini di Terminal.aplikasi
cd /tmp
git clone https://github.com/alandipert/fswatch
cd fswatch/
make
cp fswatch /usr/local/bin/fswatch
Jika anda don't memiliki c
compiler pada sistem anda, anda mungkin perlu menginstal Xcode atau Xcode command line tools - baik yang gratis. Namun, jika itu adalah kasus, anda mungkin hanya harus check out homebrew.
fswatch
versi 1.xUsage:
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.
Anda dapat menggunakan launchd untuk tujuan itu. Launchd dapat dikonfigurasi untuk secara otomatis menjalankan program ketika path file yang dimodifikasi.
Untuk contoh berikut launchd config plist akan meluncurkan program /usr/bin/logger
ketika desktop folder my account pengguna yang telah dimodifikasi:
<?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>
Untuk mengaktifkan konfigurasi plist menyimpannya ke agen luncurkan folder dalam folder Pustaka sebagai "logger.plist".
Dari shell maka anda dapat menggunakan perintah launchctl
untuk mengaktifkan logger.plist dengan menjalankan:
$ launchctl load ~/Library/LaunchAgents/logger.plist
Folder desktop sekarang sedang dipantau. Setiap kali berubah, anda harus melihat output dalam sistem.log (menggunakan Konsol.aplikasi). Untuk menonaktifkan logger.plist, jalankan:
$ launchctl unload ~/Library/LaunchAgents/logger.plist
File konfigurasi di atas menggunakan WatchPaths
pilihan. Atau anda juga dapat menggunakan
QueueDirectories
pilihan. Lihat launchd man page untuk informasi lebih lanjut.
Facebook's penjaga, tersedia melalui Homebrew, juga terlihat bagus. Ini juga mendukung penyaringan:
dua baris membangun menonton pada direktori source dan kemudian mengatur sebuah pemicu yang bernama "buildme" yang akan menjalankan sebuah alat bernama "mengecilkan-css" setiap kali sebuah file CSS berubah. Alat ini akan berlalu daftar mengubah nama file.
$ penjaga menonton ~/src
$ penjaga -- memicu ~/src buildme '*.css' -- mengecilkan-css
Pemberitahuan bahwa jalan yang harus mutlak.
penjaga adalah cross-platform API python untuk menonton file / direktori, dan memiliki builtin "trik" alat yang memungkinkan anda untuk memicu tindakan (termasuk perintah shell) ketika peristiwa terjadi (termasuk yang baru ditambahkan file, menghapus file dan file berubah).
Edit: fsw
telah disatukan menjadi fswatch
. Dalam jawaban ini, setiap referensi untuk fsw
sekarang harus membaca fswatch
.
Saya menulis sebuah fswatch
pengganti dalam C++ disebut fsw
yang memiliki beberapa perbaikan:
./configure && make && sudo make install
fsw file-0 ... file-n
Sat Feb 15 00:53:45 2014 - /path/ke/file:inodeMetaMod dimodifikasi isFile
fsw
output dapat disalurkan ke proses lain.-l, --latency
.-n, --numerik
.strftime
format string dengan -t, --waktu-format
.-u, --utc-time
.Mendapatkan fsw:
fsw
adalah host di GitHub dan dapat diperoleh kloning dengan repositori:
git clone https://github.com/emcrisostomo/fsw
Menginstal fsw:
fsw
dapat diinstal dengan menggunakan perintah berikut:
./mengkonfigurasi && membuat && sudo make install
Informasi lebih lanjut:
Saya juga menulis sebuah pengantar blog post di mana anda dapat menemukan beberapa contoh tentang bagaimana fsw
bekerja.
Saya garpu dari fswatch menyediakan fungsi inotifywait -m
dengan sedikit kurang (tidak menunggu, lebih lanjut! Saya memiliki lebih banyak masalah di Linux dengan inotifywait
...) mengurai-ramah output.
Ini merupakan perbaikan atas asli fswatch
karena itu mengirimkan jalan yang sebenarnya dari file berubah dari STDOUT daripada mengharuskan anda untuk menyediakan program yang forks.
It's menjadi batuan padat sebagai dasar dari rangkaian menakutkan bash script yang saya gunakan untuk mengotomatisasi hal.
(ini adalah off-topic) inotifywait
di Linux, di sisi lain, membutuhkan banyak kludges di atas itu dan aku masih belum't tahu cara yang baik untuk mengelola itu, meskipun saya pikir sesuatu berdasarkan node.js
mungkin menjadi tiket.
Saya memiliki INTI untuk ini dan penggunaan yang cukup sederhana
watchfiles <cmd> <paths...>
Untuk menggambarkan, perintah berikut ini akan echo Hello World
setiap kali file1
ATAU file2
perubahan; dan interval default check adalah 1 detik
watchfiles 'echo Hello World' /path/to/file1 /path/to/file2
Jika saya ingin memeriksa setiap 5 detik saya dapat menggunakan -t
bendera
watchfiles -t 'echo Hello World' /path/to/file1 /path/to/file2
-v
memungkinkan `verbose mode yang menunjukkan informasi debug-q
membuat watchfiles
mengeksekusi diam-diam (#
akan ditampilkan sehingga pengguna dapat melihat program yang sedang dikerjakan)-qq
membuat watchfiles
mengeksekusi benar-benar diam-diam-h
menunjukkan bantuan dan penggunaanhttps://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55
Jika anda ingin menggunakan NodeJS, anda dapat menggunakan paket yang disebut chokidar (atau chokidar-cli sebenarnya) untuk menonton dan kemudian menggunakan rsync
(disertakan dengan Mac):
Perintah Rsync:
$ rsync -avz --mengecualikan 'beberapa file' --mengecualikan 'beberapa-dir' './' '/saya/tujuan'
Chokidar cli (diinstal secara global melalui npm):
chokidar \"**/*\" -c \"anda-rsync-perintah di atas\"
Akhirnya aku melakukan ini untuk macOS. I'm yakin ini adalah mengerikan dalam banyak cara:
#!/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
Berikut ini's sederhana satu jalur alternatif bagi pengguna yang don't memiliki menonton
perintah yang ingin menjalankan perintah setiap 3 detik:
sementara :; melakukan perintah; tidur 3; dilakukan
It's infinite loop yang pada dasarnya adalah sama dengan melakukan hal-hal berikut:
watch-n3 anda-perintah