लगातार कई निर्देशिकाओं के भीतर inotify- उपकरण के साथ नई फ़ाइल (ओं) का पता लगाएं


17

मैंने बस inotify-tools इंस्टॉल किया है। मैं लगातार कई निर्देशिकाओं के भीतर सूचना-उपकरणों के साथ नई फ़ाइल (ओं) का लगातार पता लगाना चाहूंगा, और पोस्टफ़िक्स का उपयोग करके एक ईमेल भेजूंगा। मैं संभवतः पोस्टफ़िक्स भाग का उपयोग करके एक ईमेल भेज सकता हूं। मैं सिर्फ इस बारे में जाने का सबसे अच्छा तरीका जानने की कोशिश कर रहा हूं जब नई फाइल (एस) का पता लगाने की कोशिश कर रहा हूं। क्योंकि कभी-कभी एक साथ कई फाइलें जुड़ जाती हैं।

जवाबों:


39

inotifywait ( inotify-tools का हिस्सा ) अपने उद्देश्य को पूरा करने के लिए सही उपकरण है, इससे कोई फर्क नहीं पड़ता कि एक ही समय में कई फाइलें बनाई जा रही हैं, यह उनका पता लगाएगा।

यहाँ एक नमूना स्क्रिप्ट:

#!/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 इन विकल्पों का उपयोग करेगा।

-निर्दिष्ट रूप से डीआईआर की निगरानी करने के लिए, यदि आप इस विकल्प का उपयोग नहीं करते हैं, तो एक बार यह एक नई फ़ाइल का पता लगाने के बाद स्क्रिप्ट समाप्त हो जाएगी।

-r फ़ाइलों की पुनरावर्ती निगरानी करेगा (यदि बहुत सारी डायर / फाइलें हैं तो नई बनाई गई फाइलों का पता लगाने में कुछ समय लग सकता है)

-e बनाने नजर रखने के लिए और अपने मामले में यह किया जाना चाहिए घटना निर्दिष्ट करने का विकल्प है बनाने नई फ़ाइलों के बारे में देखभाल करने के लिए

--फॉर्म '% w% f' फ़ाइल को फॉर्मेट / अपूर्ण / path/file.name में प्रिंट करेगा

"$ {MONITORDIR}" वह चर है जिसकी निगरानी करने के लिए हम पहले परिभाषित कर चुके हैं।

इसलिए इस घटना में कि एक नई फ़ाइल बनाई जाती है, inotifywait इसका पता लगाएगा और आउटपुट (/complete/path/file.name) को पाइप में प्रिंट कर देगा और उस आउटपुट को वेरिएबल न्यूमेरिक को असाइन कर देगा

लूप के अंदर आपको अपने पते पर मेल भेजने का एक तरीका दिखाई देगा जिसमें मेलएक्स उपयोगिता का उपयोग करना चाहिए जो आपके स्थानीय एमटीए (आपके मामले में, पोस्टफिक्स) के साथ ठीक काम करना चाहिए।

यदि आप कई निर्देशिकाओं की निगरानी करना चाहते हैं, तो inotifywait इसकी अनुमति नहीं देता है, लेकिन आपके पास दो विकल्प हैं, स्क्रिप्ट के अंदर किसी फ़ंक्शन की निगरानी करने या बनाने के लिए प्रत्येक dir के लिए एक स्क्रिप्ट बनाएं, कुछ इस तरह:

#!/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" &

मैं नमूना स्क्रिप्ट में उपयोग किए गए आदेशों के बारे में कई स्पष्टीकरण जोड़ना भूल गया, मेरे उत्तर को संपादित करने का कारण है ... मैंने मामले में वह स्क्रिप्ट भी जोड़ी है जो कई dirs की निगरानी करना चाहती है। Inotifywait टूल के बारे में, बिना उल्लेख किए प्रश्न का उत्तर देना असंभव है क्योंकि op inotify-tools का उपयोग कर रहा है। वैसे, मैं यहाँ नौसिखिया हूँ, इसलिए मुझे नेटिकट के बारे में बहुत कुछ सीखने की ज़रूरत है, इसलिए, क्षमा करें यदि मेरा उत्तर आपका है, तो यह वही नहीं है जो मैं चाहता हूँ कि मैं ऑप का पूरा उत्तर देना चाहता हूँ। फिर से क्षमा।
sahsanu

कोई समस्या नहीं है और एसयू में आपका स्वागत है। नेटिकट के बारे में सीखना आमतौर पर कठिन तरीका है, क्योंकि यह वास्तव में कहीं भी परिभाषित नहीं है।
harrymc

4
@sahsanu मैं पूरी "netiquette" चीज के बारे में सहमत नहीं हूं। प्रत्येक व्यक्ति इस सवाल का जवाब दे रहा है। उत्तर के बीच कोई ओवरलैप नहीं है, और न ही एक उत्तर है जिसे फिर से लिखा गया है। जब प्रश्न इतना विशिष्ट हो, तो उस तरीके से उत्तर देना असंभव है। समय का जवाब देने के लिए बहुत-बहुत धन्यवाद। इससे आपको अधिक जानने में मदद मिली है, मेरे जैसे किसी व्यक्ति के लिए जो इस सब के बारे में सीख रहा है। आपने मुझे अनगिनत घंटे बचाए हैं।
डेविड कस्टर


एक विकसित वातावरण में नेटिकट को पूरी तरह से परिभाषित नहीं किया जा सकता है। इस साइट पर प्रथागत है कि जब तक वे बुरी तरह से नहीं लिखे जाते हैं, तब तक उत्तर की नकल न करें, और तब भी उन्हें संपादन के बजाय इसे सही करने के लिए प्रोत्साहित किया जाता है। यह हमेशा एक लोकतांत्रिक समुदाय में आपका अधिकार है कि आप सहमत न हों। @sahsanu अपनी स्क्रिप्ट दिखाते हुए मेरे पिछले जवाब का हवाला देकर मेरी टिप्पणी को टाल सकता था, जो किसी भी मामले में आपकी स्वीकृति प्राप्त कर लेता था। यही कारण है कि मैंने उसकी जगह पर काम किया है और यह मेरा नेटिकट है, जो मुझे लगता है कि मैं दूसरों के साथ साझा करता हूं (लेकिन हर किसी के साथ नहीं, निश्चित रूप से)।
harrymc

8

उदाहरण के लिए inotifywait का उपयोग करें :

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

अधिक जानकारी और उदाहरणों के लिए आलेख देखें कि
फाइलसिस्टम घटनाओं पर स्क्रिप्ट को ट्रिगर करने के लिए inotify-tools का उपयोग कैसे करें


1
यदि कोई इसका उपयोग करता है और चरों को अपरकेस में पढ़ने से परिवर्तित करता है, तो आप कुछ समय के अंदर कुछ कमांड नहीं चला पाएंगे। ऐसा इसलिए है क्योंकि आप $ PATH चर को अधिलेखित कर देंगे।
सेवेजमैन

2
@Savageman अपने स्वयं के चर के लिए अपरकेस चर नाम का उपयोग करना इस कारण से दृढ़ता से हतोत्साहित होता है। सिस्टम उपयोग के लिए अपरकेस चर नाम आरक्षित हैं; अपने स्वयं के चर को लोअरकेस का उपयोग करना चाहिए।
त्रिकाल

@tripleee इस जानकारी के लिए धन्यवाद, अपर-केस
var का

0

कई निर्देशिकाओं के लिए आप ऐसा कर सकते हैं:

#!/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 &

यहाँ फ़ाइल में फ़ोल्डर्स की एक उदाहरण सूची है /etc/default/inotifywait /etc/default/inotifywait

/home/user1
/path/to/folder2/
/some/path/
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.