जब निर्देशिका की सामग्री अपडेट की जाती है तो कमांड कैसे चलाएं?


27

एक निर्देशिका है Aजिसकी सामग्री अन्य लोगों द्वारा अक्सर बदल दी जाती है।

मैंने एक व्यक्तिगत निर्देशिका बनाई है Bजहां मैं उन सभी फाइलों को रखता हूं जो कभी भी रही हैं A

वर्तमान में, मैं बस कभी-कभार rsyncउन फ़ाइलों को प्राप्त करने के लिए दौड़ता हूं, जिनसे बैकअप लिया जा सकता Aहै B। हालाँकि, मुझे इस बात की आशंका है कि कुछ फ़ाइलों को इसमें जोड़ा जाएगा Aऔर फिर Aउन्हें कॉपी करने से पहले मुझे मौका मिलेगा B

इसे होने से रोकने का सबसे अच्छा तरीका क्या है? आदर्श रूप में, मैं चाहता हूं कि मेरी वर्तमान बैकअप स्क्रिप्ट हर बार Aबदले जाने की सामग्री को चलाए ।

जवाबों:


29

यदि आपके पास inotify-tools स्थापित है, तो आप inotifywaitकिसी फ़ाइल या निर्देशिका को लिखने के लिए किसी क्रिया को ट्रिगर करने के लिए उपयोग कर सकते हैं :

#!/bin/sh
dir1=/path/to/A/
while inotifywait -qqre modify "$dir1"; do
    /run/backup/to/B 
done

जहां -qqस्विच पूरी तरह से चुप है, -rपुनरावर्ती है (यदि आवश्यक हो) और -eइस मामले में निगरानी करने की घटना है modify। से man inotifywait:

संशोधित
देखी गई फ़ाइल या देखी गई निर्देशिका के भीतर एक फ़ाइल को लिखा गया था।

5
incrondब्याज की भी हो सकती है।
शॉन जे। गोफ

1
ठंडा। क्या मैं उपरोक्त स्क्रिप्ट को अपने bashrc में डालूंगा ताकि जब मैं लॉग इन करूं तो यह चल सके? वहाँ एक और तरीका है मैं इसे हर समय चल सकता है?
oadams

लॉगिन के लिए, /etc/profileसिस्टम-वाइड के लिए या .bash_profileकेवल आपके उपयोगकर्ता के लिए हाँ । बूट के बाद इसे चलाने के लिए, यह आपके यूनिक्स / लिनक्स के स्वाद पर निर्भर करता है; /etc/rc.local, /etc/rc.d/या/etc/init.d/
जसोवरीयन 17

1
बड़ी निर्देशिकाओं के लिए आप --monitorस्विच का उपयोग करने पर विचार कर सकते हैं (और इसके बजाय अपने लूप में आउटपुट को पाइप कर सकते हैं ), अन्यथा बहुत inotifywaitअधिक ओवरहेड होता है जब इसे फिर से शुरू किया जाता है
टोबीस किंजलर

मज़बूती से यह समाधान एफ़टीपी सर्वर के माध्यम से निर्देशिका ट्री में जोड़े गए प्रत्येक फ़ाइल के लिए एक स्क्रिप्ट को चलाने के लिए कैसे काम करेगा (मान लें कि हर 3 मिनट में औसतन एक नई फ़ाइल जोड़ी जाती है और यह वर्षों तक चल सकती है)? यदि बहुत नहीं है, तो क्या कोई वैकल्पिक समाधान है?
निकोला नोवाक

5

कड़ाई से बोलना, अगर कोई फ़ाइल को गिराता है और बहुत जल्दी इसे हटा देता है, तो आप इसे याद कर सकते हैं। के उपयोग inotify (लिनक्स के तहत, या अन्य unices के तहत एक समान सुविधा) जोखिम छोटे की खिड़की बनाता है।

यदि आप उस निर्देशिका पर अपनी पसंद की फाइल सिस्टम को माउंट कर सकते हैं (मुझे पता है कि यह एक विकल्प नहीं हो सकता है), तो आप एक है जो सभी फ़ाइल संस्करणों को रिकॉर्ड कर सकते हैं, उदाहरण के लिए copyfs


4

entrकमांड-लाइन टूल आज़माएं जो फाइलें बदलने पर मनमाना कमांड चला सकते हैं। 2.9 रिलीज के बाद से, एक निर्देशिका में -dएक नई फ़ाइल जोड़ने पर घटनाओं पर प्रतिक्रिया करने के लिए एक निर्देशिका घड़ी विकल्प ( ) जोड़ा गया था।

उपयोगिता को चलाने के लिए उदाहरण यदि कोई नई फ़ाइल प्रोजेक्ट में जोड़ी जाती है:

$ while true; do
> echo src/* | entr -d your_command
> done

डायरेक्टरी वॉच मोड में प्रत्येक फाइल की पेरेंट डायरेक्टरी को वॉच लिस्ट में जोड़ दिया जाता है।

इसका एकमात्र निहितार्थ यह है कि यदि कोई नई फ़ाइल दिखाई देती है तो उसे फ़ाइल सिस्टम को फिर से खोलने के लिए बाहरी शेल लूप की अनुमति देनी चाहिए।

यहाँ एक निर्देशिका देखने के विकल्प के बिना संस्करण है:

$ while true; do
> echo src/* src | entr your_command
> done

यहां आपकी आवश्यकताओं के आधार पर एक सरल उदाहरण दिया गया है:

$ ls -d * | entr sh -c 'rsync -vuar A B'

अधिक विवरण के लिए जाँच करें: entrproject.org वेबसाइट।


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