entr adalah alat pemberitahuan file paling sederhana dan paling komposable yang pernah saya lihat. Penggunaannya dioptimalkan untuk menonton file daripada direktori, tetapi juga dapat menyelesaikan kasus Anda.
Untuk mendeteksi dan bertindak pada file yang ditambahkan, gabungkan dengan alat lain seperti mis make
. entr
tidak mengirim nama atau semacamnya, itu hanya menjalankan apa yang Anda perintahkan untuk dijalankan.
Untuk memeriksa file yang ditambahkan dalam direktori:
## entr exits with rc=0 when terminated
## rc=1 when watched files go away or don't exist to begin with
## rc=2 when new files arrive in watched directories
until echo /path/to/directory_to_watch | entr -d do_stuff
do sleep 1; done
Jika Anda juga ingin bertindak ketika file yang ada berubah:
## Here's why it comes in handy that entr exits when new files are added --
## find gets re-run.
until find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/* |
entr -d do_stuff
do sleep 1; done
... dan di situlah mekanisme loop berguna, karena find
ekspresi akan berjalan lagi jika file ditambahkan.
Jika Anda ingin penanganan kesalahan yang lebih baik dan ingin memastikan hal-hal hanya berjalan sekali per file yang ditambahkan / dihapus, hal-hal menjadi sedikit aneh, tetapi untuk kasus-kasus sederhana ini brilian.
EDIT: Jika Anda ingin melakukan ini pada tingkat sistem, sesuatu seperti incron , cukup tambahkan skrip ke manajer proses favorit Anda (seperti s6 , runit , systemd atau sysvinit dan lewati loop:
#!/bin/bash
exec entr -d do_stuff < <(find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/*)
The exec
dan substitusi proses ( <(...)
) adalah penting ketika menjalankan dari manajer proses, untuk menangani sinyal dengan benar (yaitu untuk mendapatkan shell keluar dari jalan).