Saya ingin menonton folder di Mac saya (Snow Leopard) dan kemudian menjalankan skrip (memberikannya nama file dari apa yang baru saja dipindahkan ke folder (sebagai parameter ... x.sh "nama file")).
Saya memiliki semua skrip ditulis dalam bash (x.sh) yang akan memindahkan beberapa file dan hal-hal lain pada input $ 1. Saya hanya perlu OSX untuk memberi saya nama file ketika file / folder baru dipindahkan / dibuat menjadi dir.
Ada perintah seperti itu?
fswatch
util disajikan sebagai jawaban di bawah ini sebenarnya tidak menggunakan metode ini.Jawaban:
fswatch
fswatch adalah program kecil menggunakan Mac OS X FSEvents API untuk memantau direktori. Ketika suatu peristiwa tentang perubahan apa pun ke direktori itu diterima, perintah shell yang ditentukan dijalankan oleh
/bin/bash
Jika Anda menggunakan GNU / Linux, inotifywatch (bagian dari
inotify-tools
paket di sebagian besar distribusi) menyediakan fungsionalitas serupa.Pembaruan:
fswatch
sekarang dapat digunakan di banyak platform termasuk BSD, Debian, dan Windows.Sintaks / Contoh Sederhana
Cara baru yang dapat menonton banyak jalur - untuk versi 1.x dan lebih tinggi :
Cara yang lebih lama untuk versi 0.x :
Instalasi dengan Homebrew
Pada 9/12/13 ditambahkan kembali ke homebrew - yay! Jadi, perbarui daftar rumus Anda (
brew update
) dan kemudian yang perlu Anda lakukan adalah:Instalasi tanpa Homebrew
Ketik perintah ini di
Terminal.app
Jika Anda tidak memiliki
c
kompiler pada sistem Anda, Anda mungkin perlu menginstal alat baris perintah Xcode atau Xcode - keduanya gratis. Namun, jika itu masalahnya, Anda mungkin harus memeriksa homebrew .Opsi tambahan untuk
fswatch
versi 1.xsumber
make
melempar kesalahan tentang tidak menemukan makefile. Untungnya, fswatch sekarang ada di MacPorts, jadisudo port install fswatch
berfungsi, bagi kita yang menggunakan MacPorts, bukan Homebrew.fswatch ./ | xargs -I{} cp {} ~/Dropbox/backup/latest/
fswatch .
akan memantau direktori saat ini.fswatch -0 -v -o /path/to/watched/files | xargs -0 -n 1 -I {} [your command]
dengan-0
untuk NULLs. Yang ini berfungsi untuk saya untuk kompilasi yang kurangAnda dapat menggunakan launchd untuk tujuan itu. Launchd dapat dikonfigurasikan untuk secara otomatis meluncurkan program ketika path file diubah.
Sebagai contoh, daftar konfigurasi launchd berikut akan meluncurkan program
/usr/bin/logger
ketika folder desktop dari akun pengguna saya dimodifikasi:Untuk mengaktifkan config plist, simpan ke folder LaunchAgents di folder Library Anda sebagai "logger.plist".
Dari shell Anda kemudian dapat menggunakan perintah
launchctl
untuk mengaktifkan logger.plist dengan menjalankan:Folder desktop sekarang sedang dipantau. Setiap kali diubah, Anda akan melihat output di system.log (gunakan Console.app). Untuk menonaktifkan logger.plist, jalankan:
File konfigurasi di atas menggunakan
WatchPaths
opsi. Atau Anda juga dapat menggunakanQueueDirectories
opsi. Lihat halaman manual launchd untuk informasi lebih lanjut.sumber
/usr/bin/logger
dengan skrip Bash saya dan menghapus"<string>path modified</strong>"
entri, saya tidak dapat menemukan cara apa pun untuk skrip bash saya untuk mengetahui file mana di desktop saya yang dimodifikasi - hanya saja peristiwa itu terjadi. Saya mencoba melihat$0
,$1
dan hanya mendapatkan nama skrip itu sendiri, mencatat berlalu.Penjaga Facebook , tersedia melalui Homebrew, juga terlihat bagus. Ini mendukung juga penyaringan:
Perhatikan bahwa jalan harus mutlak.
sumber
Anda mungkin ingin melihat (dan mungkin memperluas) alat kecil saya
kqwait
. Saat ini ia hanya duduk dan menunggu acara tulis pada satu file, tetapi arsitektur kqueue memungkinkan untuk susun acara hirarkis ...sumber
fswatch
(yang juga baik-baik saja, karena itu seperti pembungkus cahaya itu juga dapat dimodifikasi untuk melakukan hal yang benar saya yakin) di mana ia akan menyala ketika menjalankan hal-hal sepertigit status
(yang sebenarnya dijalankan setiap kali zsh prompt diberikan pada mesin saya ...) yang sebenarnya agak mengacaukan skrip rumit ini yang saya miliki dengan membuat umpan balik tanpa akhir. kqwait, bagaimanapun, memberikan info tentang file yang diubah, dan tidak tersandung olehgit status
. Saya membutuhkannya untuk menulis.$ brew install kqwait && while true; do kqwait doc/my_file.md; make; done
watchdog adalah API python lintas-platform untuk menonton file / direktori, dan telah dibangun di dalam alat "trik" yang memungkinkan Anda untuk memicu tindakan (termasuk perintah shell) ketika peristiwa terjadi (termasuk file baru yang ditambahkan, file yang dihapus dan file yang diubah).
sumber
Ini hanya untuk menyebutkan entr sebagai alternatif pada OSX untuk menjalankan perintah sewenang-wenang ketika file berubah. Saya merasa sederhana dan bermanfaat.
sumber
Berikut ini adalah one-liner using
sschober
's tool .sumber
$ brew install kqwait
Sunting:
fsw
telah digabung menjadifswatch
. Dalam jawaban ini, referensi apa punfsw
harus sekarang dibacafswatch
.Saya menulis
fswatch
pengganti di C ++ yang disebutfsw
fitur beberapa perbaikan:Ini adalah proyek Sistem Bangun GNU yang dibangun di atas platform apa pun yang didukung (OS X v.> = 10.6) dengan
Beberapa jalur dapat dilewatkan sebagai argumen yang berbeda:
Itu membuang catatan rinci dengan semua informasi acara seperti:
Outputnya mudah diurai sehingga
fsw
output dapat disalurkan ke proses lain.-l, --latency
.-n, --numeric
.strftime
string format dengan-t, --time-format
.-u, --utc-time
.Mendapatkan fsw:
fsw
di- host di GitHub dan dapat diperoleh kloning repositori-nya:Menginstal fsw:
fsw
dapat diinstal menggunakan perintah berikut:Informasi lebih lanjut:
Saya juga menulis posting blog pengantar di mana Anda dapat menemukan beberapa contoh tentang cara
fsw
kerjanya.sumber
Tindakan Folder Apple OSX memungkinkan Anda untuk mengotomatisasi tugas berdasarkan tindakan yang diambil pada folder.
sumber
Garpu fswatch saya menyediakan fungsionalitas
inotifywait -m
dengan sedikit lebih sedikit (jangan menunggu, lebih! Saya punya banyak masalah di Linux denganinotifywait
...) keluaran parse-friendly.Ini merupakan perbaikan dari yang asli
fswatch
karena mengirimkan jalur sebenarnya dari file yang diubah melalui STDOUT daripada mengharuskan Anda untuk menyediakan program yang dibuatnya.Sudah solid sebagai dasar dari serangkaian skrip bash menakutkan yang saya gunakan untuk mengotomatisasi hal-hal.
(ini di luar topik)
inotifywait
di Linux, di sisi lain, membutuhkan banyak kludges di atasnya dan saya masih belum menemukan cara yang baik untuk mengelolanya, meskipun saya pikir sesuatu yang didasarkan padanode.js
mungkin tiketnya.sumber
brew install https://raw.github.com/mlevin2/homebrew/116b43eaef08d89054c2f43579113b37b4a2abd3/Library/Formula/fswatch.rb
Saya punya GIST untuk ini dan penggunaannya cukup sederhana
Sebagai ilustrasi, perintah berikut akan menggema
Hello World
setiap kalifile1
ATAUfile2
berubah; dan pemeriksaan interval default adalah 1 detikJika saya ingin memeriksa setiap 5 detik saya bisa menggunakan
-t
bendera-v
mengaktifkanverbose
mode yang menampilkan informasi debug-q
membuatwatchfiles
eksekusi dengan diam-diam (#
akan ditampilkan sehingga pengguna dapat melihat program mengeksekusi)-qq
membuatwatchfiles
eksekusi sepenuhnya dengan tenang-h
menunjukkan bantuan dan penggunaanhttps://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55
sumber
Saya akhirnya melakukan ini untuk macOS. Saya yakin ini mengerikan dalam banyak hal:
sumber
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 --exclude 'some-file' --exclude 'some-dir' './' '/my/destination'
Cli Chokidar (diinstal secara global melalui npm):
chokidar \"**/*\" -c \"your-rsync-command-above\"
sumber
Berikut adalah alternatif baris tunggal sederhana untuk pengguna yang tidak memiliki
watch
perintah yang ingin menjalankan perintah setiap 3 detik:while :; do your-command; sleep 3; done
Ini adalah infinite loop yang pada dasarnya sama dengan melakukan hal berikut:
watch -n3 your-command
sumber
your-command
apakah disk I / O, maka itu disk dijamin baca / tulis setiap 3 detik - atau 10.800 kali setiap jam. Dengan menggunakan peristiwa filesystem Anda akan dijamin bahwa I / O (dan operasi mahal lainnya) hanya terjadi ketika Anda mengubah file (yang umumnya hanya beberapa kali dalam satu jam.)watch
untuk sementara waktu untuk melihat apa yang dilakukan sesuatu. Saya tidak menggunakan teknik yang saya sebutkan untuk aplikasi produksi atau semacamnya. Misalnya, saya ingin melihat perkembangannyadd
, dan teknik saya mewujudkannya (menggantikan yangyour-command
sesuai untuk mengirim sinyal yang sesuaidd
).