Saya telah melihat jawaban ini .
Anda harus mempertimbangkan menggunakan inotifywait, sebagai contoh:
inotifywait -m /path -e create -e moved_to | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" # do something with the file done
Pertanyaan saya adalah, skrip di atas mengawasi direktori untuk pembuatan file jenis apa pun, tetapi bagaimana cara memodifikasi inotifywait
perintah untuk melaporkan hanya ketika file dengan jenis / ekstensi tertentu dibuat (atau dipindahkan ke direktori) - mis. Seharusnya melaporkan ketika ada .xml
file yang dibuat.
APA YANG SAYA MENCOBA:
Saya telah menjalankan inotifywait --help
perintah, dan telah membaca opsi baris perintah. Ini memiliki --exclude <pattern>
dan --excludei <pattern>
perintah untuk MENGECUALIKAN file dari jenis tertentu (dengan menggunakan regEx), tapi saya perlu cara untuk MENGMASUK hanya file dari jenis / ekstensi tertentu.
path
atas mungkin bukan nama variabel terbaik jika Anda ingin bermain dengan ini terlebih dahulu dalam shell. Jika Anda menggunakannya, maka Anda tidak akan dapat menggunakan perintah dan semuanya karena ini pada dasarnya hanya menimpa standarPATH
. Karenanya saya merekomendasikan menggunakan nama var alternatif, sepertifpath
sebagai gantinya. yaituwhile read fpath action file
maka setiap perintah standar yang biasanya tersedia dari shell Anda akan tetap ada.Jawaban:
Harap perhatikan bahwa ini adalah kode yang belum diuji karena saya tidak memiliki akses ke
inotify
sekarang. Tetapi sesuatu yang mirip dengan ini seharusnya bekerja:sumber
incron
(saya harap tidak).inotify
dengannohup
atau memulainya dengan layanan systemd kustom. Paling sering yang terakhir.Gunakan negatif ganda:
Ini hanya akan mencakup file javascript
sumber
inotifywait
daripada membuatnya menghasilkan output besar untuk semua file dan menyaring setelah itu (seperti pada jawaban lainnya). Belum mencoba, tapi saya kira itu akan melakukan sedikit lebih cepat.--exclude
input untuk menonton.ext
file. Ini dijalankan hanya sekali atau dalam untuk loop?inotifywait -m --exclude "[^.][^e][^x][^t]$" /home/jonas/Skrivbord/test -e create -e moved_to | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" done
Saya yakin regex dapat dioptimalkan, tetapi bayi ini bekerja :)Sementara pendekatan ganda-negatif dari jawaban sebelumnya adalah ide yang bagus karena (seperti yang dicatat TMG) memang mengubah pekerjaan penyaringan
inotifywait
, itu tidak benar.Misalnya, jika file berakhir
as
maka tidak akan cocok[^j][^s]$
karena huruf terakhirs
tidak cocok[^s]
, oleh karena itu tidak akan dikecualikan.Dalam istilah Boolean, jika
S
adalah pernyataan:dan
J
merupakan pernyataan:maka nilai
--exclude
parameter semantik harus sama dengannot(J and S)
, yang oleh hukum De Morgan adalahnot(J) or not(S)
.Masalah potensial lain adalah bahwa dalam
zsh
,$path
adalah variabel bawaan yang mewakili setara dengan array$PATH
, sehinggawhile read path ...
baris tersebut akan benar-benar kacau$PATH
dan menyebabkan semuanya menjadi tidak dapat dieksekusi dari shell.Karena itu pendekatan yang benar adalah:
Catat
.
yang diperlukan setelah[^j]
untuk memastikan bahwa pertandingan diterapkan dalam posisi kedua dari belakang, dan juga bahwa|
karakter (mewakili boolean ATAU yang disebutkan di atas) tidak boleh melarikan diri di sini karena--exclude
mengambil POSIX diperpanjang regular expressions.sumber