Birden çok dizin içindeki inotify araçlarıyla yeni dosyaları sürekli olarak tespit et


17

Az önce inotify araçlarını kurdum. Sürekli olarak birden çok dizin içinde bildirme araçları ile yeni dosyaları sürekli olarak tespit etmek ve postfix kullanarak bir e-posta göndermek istiyorum. Muhtemelen postfix bölümünü kullanarak e-posta gönderebilirim. Ben sadece yeni dosya (lar) tespit etmeye çalışırken bu konuda gitmek için en iyi yolu anlamaya çalışıyorum. Çünkü bazen aynı anda birden fazla dosya eklenir.

Yanıtlar:


39

inotifywait ( inotify araçlarının bir parçası ) hedefinize ulaşmak için doğru araçtır, aynı anda birkaç dosyanın oluşturulması önemli değildir, onları algılar.

İşte örnek bir komut dosyası:

#!/bin/sh
MONITORDIR="/path/to/the/dir/to/monitor/"
inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
done

inotifywait bu seçenekleri kullanacaktır.

-m dir süresiz izlemek için, bu seçeneği kullanmazsanız, yeni bir dosya algıladıktan sonra komut dosyası sona erer.

-r dosyaları özyinelemeli olarak izler (çok sayıda dirs / dosya varsa, yeni oluşturulan dosyaları algılamak biraz zaman alabilir)

-e create , izlenecek olayı belirtme seçeneğidir ve durumunuzda yeni dosyalara dikkat etmek için yaratılması gerekir

--format '% w% f' dosyayı /complete/path/file.name biçiminde yazdırır

"$ {MONITORDIR}" , daha önce tanımladığımız izleme yolunu içeren değişkendir.

Böylece yeni bir dosya oluşturulması durumunda inotifywait dosyayı algılar ve çıktıyı (/complete/path/file.name) boruya yazdırır ve bu çıktıyı NEWFILE değişkenine atar .

While döngüsünün içinde, yerel MTA'nızla ( çalışmanız durumunda Postfix) iyi çalışması gereken mailx yardımcı programını kullanarak adresinize posta göndermenin bir yolunu göreceksiniz .

Birkaç dizini izlemek istiyorsanız, inotifywait buna izin vermez, ancak iki seçeneğiniz vardır, her dir için kodun içinde izlemek veya bir işlev oluşturmak için bir komut dosyası oluşturun:

#!/bin/sh
MONITORDIR1="/path/to/the/dir/to/monitor1/"
MONITORDIR2="/path/to/the/dir/to/monitor2/"
MONITORDIRX="/path/to/the/dir/to/monitorx/"    

monitor() {
inotifywait -m -r -e create --format "%f" "$1" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &

Cevabımı düzenlemek için örnek komut dosyasında kullanılan komutlarla ilgili çeşitli açıklamalar eklemeyi unuttum ... cevabımı birkaç dir izlemek istiyorsa ben de komut dosyası ekledi. İnotifywait aracı ile ilgili olarak, soruyu belirtmeden cevaplamak imkansızdır çünkü op inotify araçlarını kullanıyor. Bu arada, ben burada bir acemi değilim, bu yüzden netiquette hakkında çok şey öğrenmem gerekiyor, bu yüzden cevabım seninle çakışırsa özür dilerim, sadece op için tam bir cevap vermek istediğim şey değildi. Tekrar üzgünüm.
sahsanu

Sorun değil ve SU'ya hoş geldiniz. Netiquette hakkında bilgi edinmek, genellikle hiçbir yerde tanımlanmadığı için genellikle zor bir şekilde yapılır.
harrymc

4
@sahsanu Bütün "netiquette" olayı hakkında hemfikir değilim. Her kişi soruyu kendi bakış açısıyla cevaplıyor. Cevaplar arasında bir çakışma veya yeniden yazılmış bir cevap yoktur. Soru çok spesifik olduğunda cevapların bu şekilde değişmesi imkansızdır. Soruyu ayrıntılı olarak cevaplamak için zaman ayırdığınız için çok teşekkür ederim. Tüm bunları öğrenen benim gibi biri için bu, bildiğinizden daha fazla yardımcı oldu. Beni saatlerce kurtardın.
David Custer


Gelişen bir ortamda Netiquette kesinlikle tanımlanamaz.Bu, kötü yazılmış olmadıkça cevapları çoğaltmamak için alışılmış bir durumdur ve o zaman bile bunları düzenleme yoluyla düzeltmek teşvik edilir. Demokratik bir toplumda hemfikir olmamanız her zaman sizin hakkınızdır. @sahsanu senaryosunu gösterirken önceki cevabımdan bahsederek sözlerimi önleyebilirdi, bu da her durumda onayınızı alacaktı. Onun yerine böyle yapardım ve başkaları ile paylaştığımı düşündüğüm netiquette'im (tabii ki herkesle değil).
harrymc

8

İnotifywait kullanın , örneğin:

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

Daha fazla bilgi ve örnek
için dosya sistemi olaylarındaki komut dosyalarını tetiklemek için inotify araçlarını kullanma makalesine bakın .


1
Herhangi biri bunu kullanır ve değişkenleri büyük harfle okumadan dönüştürürse, süre içinde bazı komutları çalıştıramazsınız. Bunun nedeni $ PATH değişkeninin üzerine yazmanızdır.
Savageman

2
@Savageman Bu nedenle , kendi değişkenleriniz için büyük harfli değişken adları kullanmak kesinlikle önerilmez. Büyük harfli değişken adları sistem kullanımı için ayrılmıştır; kendi değişkenleriniz küçük harf kullanmalıdır.
Üçlü

@tripleee Bilgi için teşekkürler, artık büyük harf vars kullanmayacak :)
Savageman

0

Birkaç dizin için bunu yapabilirsiniz:

#!/bin/bash


monitor() {
  inotifywait -m -r -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read NEWFILE
  do
     echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
  done
          }


monitor &

İşte dosyadaki klasörlerin örnek bir listesi /etc/default/inotifywait /etc/default/inotifywait

/home/user1
/path/to/folder2/
/some/path/
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.