Bagaimana cara mendeteksi file baru di folder dengan skrip bash ? Saya ingin memproses file segera setelah dibuat di folder. Apakah ini mungkin untuk dilakukan atau saya harus menjadwalkan skrip dengan cron yang memeriksa file baru setiap menit atau lebih?
shell
filesystems
files
directory
monitoring
ihatetoregister
sumber
sumber
Jawaban:
Anda harus mempertimbangkan untuk menggunakan
inotifywait
, sebagai contoh:Di Ubuntu
inotifywait
disediakan olehinotify-tools
paket. Pada versi 3.13 (saat ini di Ubuntu 12.04)inotifywait
akan menyertakan nama file tanpa opsi -f. Versi yang lebih lama mungkin perlu dipaksakan. Yang penting untuk dicatat adalah bahwa-e
opsi untukinotifywait
adalah cara terbaik untuk melakukan penyaringan acara. Selain itu,read
perintah Anda dapat menetapkan output posisi menjadi beberapa variabel yang dapat Anda pilih untuk digunakan atau abaikan. Tidak perlu menggunakan grep / sed / awk untuk preprocess output.sumber
inotifywait
hanya apa yang saya inginkan.The '--filename' option no longer exists. The option it enabled in earlier versions of inotifywait is now turned on by default.
, Anda hanya perlu melakukannya,inotifywait -m /path -e create |
saya akan mencoba dan mengedit jawaban ini.fswatch
. Saya tidak menulisnya, tapi ini open source dan saya menggunakannya.Saya lebih suka
incron
, karena lebih mudah dikelola. Pada dasarnya ini adalah layanan yang memanfaatkaninotify
dan Anda dapat mengatur konfigurasi untuk mengambil tindakan berdasarkan operasi perubahan file.Ex:
Anda dapat melihat contoh lengkapnya di sini: http://www.cyberciti.biz/faq/linux-inotify-examples-to-replicate-directories/
sumber
Saya baru saja memasak ini, dan tidak melihat masalah besar dengan itu, selain kemungkinan kecil file yang hilang di antara cek.
Jika pemrosesan file Anda tidak terlalu lama, Anda tidak boleh melewatkan file baru. Anda juga bisa latar belakang kegiatan ... Ini bukan bukti peluru, tetapi melayani beberapa tujuan tanpa alat eksternal seperti inotify.
sumber
inotify
tidak tersedia. Saya akan menambahkan-type f
untuk memfilter file saja. Kalau tidak, folder juga akan dikembalikan.-f filename
opsinya bagus. Jadi, satu-satunya pertanyaan yang tersisa adalah bagaimana memulai ini saat reboot. Saya akan menggunakan ini dengan pembangkit listrik tenaga surya sayaos.system("ssh me@mysystem ' ( touch /home/me/alarms/low24 ) '")
sehingga pembuatan file ini akan menyebabkan komputer master menggunakanespeak
dan mengumumkan tegangan rendah. Itu sudah mengirim saya email tetapi karena sistem saya sudah berbicara waktu di bagian atas jam itu semua sisanya. askubuntu.com/questions/977613/…Anda dapat menggunakan
watch
skrip AndaMonitor folder Anda dan daftarkan semua yang ada di dalamnya setiap 0,1 detik
Kekurangan
Bukan waktu nyata, jadi jika file dibuat dan dihapus dalam waktu kurang dari 0,1 detik, maka ini tidak akan berfungsi,
watch
hanya mendukung minimum 0,1 detik.sumber
Saya mengasumsikan folder target (saya akan menyebutnya
isempty
hanya untuk kenyamanan) kosong dan Anda sedang menunggu satu atau lebih file dijatuhkan di sana.Anda dapat menggunakan perintah berikut:
hanya untuk memeriksa apakah folder tersebut masih kosong, sebenarnya itu akan mengembalikan 0 jika tidak ada file baru (maka
isempty
folder tersebut masih kosong) atau, di sisi lain, itu akan mengembalikan nilai lebih besar dari 0 (sebenarnya jumlahnya file saat ini dalam folder).Yang mengatakan konyol jika tes dapat membuat sisa pekerjaan:
Tentu saja
do_something
fungsi harus memanipulasi file dalamisempty
folder dan kemudian menghapusnya dari folder itu sendiri setelah diproses.Menambahkan baris seperti berikut di crontab Anda akan menjalankan pemeriksaan satu menit sekali dan akan memicu
do_something
tindakan jika folder tidak kosong tentu saja:sumber
ls
untuk skrip. Gunakanfind
atau globbing sederhana sebagai gantinya: mywiki.wooledge.org/ParsingLsJika Anda ingin mendeteksi file baru, kemudian memprosesnya dan pada akhirnya menghapus file yang diproses Anda dapat menggunakan systemd.path . Metode ini didasarkan pada inotify. Ada opsi DirectoryNotEmpty, jadi systemd dapat menjalankan skrip Anda selalu ketika mendeteksi file dalam direktori. Anda harus ingat itu akan berfungsi hanya jika Anda dapat menghapus file yang diproses dan script meninggalkan direktori kosong.
Pertama-tama siapkan file mymonitor.service
selanjutnya pergi ke mymonitor.path untuk menentukan path
Jika nama file .path sama dengan nama layanan, tidak perlu menentukan nama layanan dalam file .path.
Itu didasarkan pada Pemantauan Akses File untuk Dummies
sumber
entr
Menggunakan
entr
adalah cara baru untuk melakukan ini (itu lintas platform). Noteentr
tidak menggunakan polling yang memberikan keuntungan besar dibanding banyak alternatif.Pada BSD yang digunakannya
pledge(2)
Anda dapat menginstalnya dengan
Anda dapat melacak direktori untuk penambahan baru menggunakan
Opsi dijelaskan (dari dokumen),
sumber
Bash tidak bisa melakukan ini dengan mudah. Anda pada dasarnya harus mendapatkan daftar semua file di folder dan secara berkala mendapatkan daftar baru dan membandingkannya untuk melihat apa yang berubah.
Apa yang Anda cari disebut inotify. Itu dibangun ke dalam kernel linux dan pada dasarnya Anda bisa duduk di sana menunggu sesuatu terjadi pada saat titik inotify kembali dan berkata 'hei, ada file baru bernama foobar'
Untuk mencapai apa yang Anda inginkan, Anda harus beralih ke sesuatu seperti perl dan menggunakan Linux :: Inotify2 (python mungkin mendukung inotify juga, tapi saya orang perl).
sumber
Ini berfungsi di cygwin dan Linux. Beberapa solusi sebelumnya yang menulis file akan menyebabkan hard disk rusak. Skrip ini tidak memiliki masalah:
sumber
Di bawah ini adalah versi singkat contoh tentang stackoverflow yang telah saya uji dan dimasukkan ke dalam salah satu proyek saya yang memerlukan pemantauan direktori tertentu.
Berikut ini tautan ke skrip yang menggunakan versi modifikasi di atas untuk secara otomatis mendekripsi file atau direktori yang ditemukan di sshfs mount point-nya; proyek yang disebutkan sebelumnya.
sumber