किसी विशिष्ट एक्सटेंशन की फ़ाइलों के निर्माण के लिए निर्देशिका देखने के लिए inotifywait का उपयोग कैसे करें


21

मैंने इसका उत्तर देखा है ।

आपको एक उदाहरण के रूप में, इनोटिफ़ाइट का उपयोग करने पर विचार करना चाहिए:

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

मेरा प्रश्न यह है कि, उपरोक्त स्क्रिप्ट किसी भी प्रकार की फ़ाइलों के निर्माण के लिए एक निर्देशिका को देखती है, लेकिन मैं inotifywaitकेवल तभी रिपोर्ट करने के लिए कमांड को कैसे संशोधित करता हूं जब किसी निश्चित प्रकार / एक्सटेंशन की फ़ाइल बनाई जाती है (या निर्देशिका में स्थानांतरित की जाती है) - जैसे यह चाहिए रिपोर्ट जब कोई .xmlफ़ाइल बनाई जाती है।

मैंने क्या कोशिश की:

मैंने inotifywait --helpकमांड चलाया है , और कमांड लाइन विकल्प पढ़ा है। यह है --exclude <pattern>और --excludei <pattern>आदेशों को अपवर्जित (regex का उपयोग करके) कुछ प्रकार की फ़ाइलों को, लेकिन मैं करने के लिए कोई तरीका होना चाहिए बस शामिल एक खास प्रकार / एक्सटेंशन के फ़ाइलें।


BTW, pathऊपर का उपयोग करना शायद सबसे अच्छा चर नाम नहीं है यदि आप इसे पहली बार एक शेल में खेलना चाहते हैं। यदि आप इसका उपयोग करते हैं, तो आप कमांड और सब कुछ का उपयोग करने में सक्षम नहीं होंगे क्योंकि यह मूल रूप से केवल मानक को ओवरराइड करता है PATH। इसलिए मैं fpathइसके बजाय एक वैकल्पिक var नाम का उपयोग करने की सलाह देता हूं । यानी while read fpath action fileतब आपके शेल से आमतौर पर मिलने वाला कोई भी मानक कमांड होगा।
बैप्टिस्ट माथस

यह हास्यास्पद है कि इसमें शामिल विकल्प नहीं है।
इरंड्रोस

जवाबों:


17

मैं केवल कुछ प्रकार / एक्सटेंशन की फ़ाइल बनाते समय रिपोर्ट करने के लिए inotifywait कमांड को कैसे संशोधित करूं

कृपया ध्यान दें कि यह अनुपयोगी कोड है क्योंकि मेरे पास अभी पहुँच नहीं है inotify। लेकिन इसके लिए कुछ काम करना चाहिए:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        if [[ "$file" =~ .*xml$ ]]; then # Does the file end with .xml?
            echo "xml file" # If so, do your thing here!
        fi
    done

2
यह काम करता है और मैंने इसे inotifywait के साथ परीक्षण किया है।
TheBetterJORT

1
आप इसे कैसे चलाते हैं? क्या यह एक बार का कमांड है, या इसे लूप में चलने की जरूरत है या ऐसा कुछ भी? शायद के हिस्से के रूप में incron(मुझे आशा है कि नहीं)।
एसडीसोलर

@SDsolar यह बदलता रहता है। मेरे लिए, मैं आमतौर पर inotifyया तो nohupएक कस्टम सिस्टमड सेवा के साथ चलाता हूं या इसे शुरू करता हूं । बहुधा बाद वाला।
सत्तारूढ़

9

एक दोहरे नकारात्मक का उपयोग करें:

inotifywait -m --exclude "[^j][^s]$" /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
    done

इसमें केवल जावास्क्रिप्ट फाइलें शामिल होंगी


1
अच्छा, मुझे यह पसंद है कि यह फ़िल्टरिंग को स्थानांतरित करने के inotifywaitबजाय सभी फाइलों और फ़िल्टर के लिए बहुत बड़ा आउटपुट उत्पन्न करता है (जैसे अन्य उत्तर में)। कोशिश नहीं की है, लेकिन मुझे लगता है कि थोड़ा तेज प्रदर्शन होगा।
TMG

यह ठीक वही है जिसकी तलाश मुझे थी। फ़ाइलों के --excludeलिए देखने के लिए इनपुट को कैसे संशोधित .extकरें। यह केवल एक बार या लूप के लिए चलाया जाता है?
कुरोकिरस्मा

यह एक डेमॉन है, इसलिए यह तब तक चलेगा जब तक कि यह दुर्घटनाग्रस्त न हो जाए या आप इसे बंद न कर दें :)
जोनास ईयरडेल

क्षमा करें, पहला प्रश्न याद किया। 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 मुझे यकीन है कि रेगेक्स को अनुकूलित किया जा सकता है, लेकिन यह बच्चा काम करता है :)
जोनास अर्लेंडल

Thanxs !! मैं इसे आज़माऊँगा !!
कुरुकिरस्मा

3

जबकि पिछले उत्तर के दोहरे-नकारात्मक दृष्टिकोण के बाद से यह एक अच्छा विचार है (जैसा कि टीएमजी ने उल्लेख किया है) यह वास्तव में फ़िल्टरिंग के काम को स्थानांतरित करता है inotifywait, यह सही नहीं है।

उदाहरण के लिए, यदि कोई फ़ाइल समाप्त होती है asतो वह मेल नहीं खाएगी [^j][^s]$क्योंकि अंतिम पत्र sमेल नहीं खाता है [^s], इसलिए इसे बाहर नहीं किया जाएगा।

बूलियन शब्दों में, यदि Sकथन है:

"अंतिम पत्र है s"

और Jबयान है:

"दंडात्मक पत्र है j"

तब --excludeपैरामीटर का मान शब्द के बराबर होना चाहिए not(J and S), जो कि डी मॉर्गन के नियमों के अनुसार है not(J) or not(S)

एक और संभावित समस्या यह है कि zsh, $pathएक बिल्ट-इन वैरिएबल है $PATH, जो सरणी के बराबर का प्रतिनिधित्व करता है , इसलिए while read path ...लाइन पूरी तरह से गड़बड़ हो जाएगी $PATHऔर सब कुछ खोल से अप्राप्य हो जाएगी।

इसलिए सही तरीका है:

inotifywait -m --exclude "[^j].$|[^s]$" /path -e create -e moved_to |
    while read dir action file; do
        echo "The file '$file' appeared in directory '$dir' via '$action'"
    done

ध्यान दें कि यह सुनिश्चित .करने के बाद [^j]कि मैच को दंडात्मक स्थिति में लागू किया गया है, और यह भी कि |चरित्र (बूलियन या ऊपर उल्लेख किया गया है) को यहां से बचना नहीं चाहिए क्योंकि --excludePOSIX विस्तारित नियमित अभिव्यक्ति लेता है।

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