परिवर्तनों के लिए एक फ़ोल्डर की निगरानी करें, और जब एक बदलाव का पता चलता है तो एक कमांड चलाएं


10

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

यह कमांड लाइन, या सिस्टम में निर्मित एप्लिकेशन, कोई तृतीय-पक्ष एप्लिकेशन के माध्यम से संभव होना चाहिए।

कोई विचार?



एक और डुबकी? Apple.stackexchange.com/questions/6658/…

जवाबों:


6

इस तरह एक संपत्ति सूची सहेजें ~/Library/LaunchAgents/test.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd>
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>test</string>
    <key>ProgramArguments</key>
    <array>
        <string>say</string>
        <string>yy</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>~/Desktop/</string>
    </array>
</dict>
</plist>

एजेंट को लोड करके launchctl load ~/Library/LaunchAgents/test.plistया उसके अंदर और पीछे लॉग इन करके लोड किया जा सकता है। परिवर्तन को लागू करने और प्लिस्ट को लोड करने की आवश्यकता होती है।

~/डिफ़ॉल्ट रूप से वॉल्‍डपैथ में टिल्ड एक्‍सटेंशन ( ) काम करता है। EnableGlobbing प्रोग्रामकार्ड के लिए वाइल्डकार्ड और टिल्ड विस्तार जोड़ता है, लेकिन यह प्रोग्राम या वॉचपैथ को प्रभावित नहीं करता है।

यदि अंतिम आह्वान से दस सेकंड के भीतर एक देखी गई फ़ाइल को संशोधित किया जाता है, तो इस तरह एक संदेश system.log में जोड़ा जाता है:

com.apple.launchd.peruser.501[146]: (test) Throttling respawn: Will start in 7 seconds

संदेशों से छुटकारा पाने का एक तरीका sleep 10स्क्रिप्ट के अंत में कुछ जोड़ना है । ThrottleInterval को 10 पर सेट करने से मदद नहीं मिलती है।

देखे गए फ़ोल्डर के सबफ़ोल्डर में परिवर्तन का पता नहीं लगाया गया है।

देखें man launchdऔर man launchd.plistअधिक जानकारी के लिए।


6

entr (1) फ़ाइलों को बदलने पर कमांड चलाने के लिए एक उपयोगिता है। यह STDIN पर फ़ाइल की एक सूची पढ़ता है और मतदान से बचने के लिए kqueue (2) का उपयोग करता है ।

उदाहरण:

ls my_project/*.html | entr echo "file changed"

3

आप फ़ोल्डर क्रियाओं का उपयोग कर सकते हैं, जो आपको फ़ोल्डर में सामग्री को बदलने पर स्वचालित (स्क्रिप्ट) निष्पादित करने देता है। जहाँ तक मुझे पता है, Automator में एक टेम्पलेट है जो आपको आसानी से एक नया फ़ोल्डर एक्शन बनाने और वांछित फ़ोल्डर में संलग्न करने की सुविधा देता है। और "रन शैल स्क्रिप्ट" कार्रवाई जोड़कर, आपको बस वांछित प्रभाव प्राप्त करना चाहिए।


5
धन्यवाद, लेकिन ऐसा प्रतीत होता है कि "फ़ोल्डर क्रियाएँ" केवल तभी चालू होती हैं जब किसी फ़ाइल को फ़ोल्डर में जोड़ा जाता है, न कि जब किसी मौजूदा फ़ाइल की जाँच की जाती है।
लुई बी।

3

जब फ़ाइल को जोड़ा या संशोधित किया जाता है, तो ट्रिगर के लिए फ़ोल्डर क्रियाएं ठीक होती हैं।

हालाँकि, यदि आपकी बदली हुई परिभाषा में फ़ाइल हटाना शामिल है, तो OSX फ़ोल्डर क्रियाओं का पता नहीं लगता है कि कोई फ़ाइल निकाली गई है या नहीं।

प्रश्न का उत्तर देने के लिए:

  1. FileWatcher निर्भरता को यहाँ से डाउनलोड करें: https://github.com/eonist/swift-utils

  2. कॉमांडलाइन में तेजी से चलने के साथ अपने आप को परिचित करें: http://krakendev.io/blog/scripting-n-ift

  3. फ़ोल्डर देखने के लिए इस कोड का उपयोग करें।

कोड:

var fileWatcher = FileWatcher(["~/Desktop/test/".tildePath])/*<---the fileWatcher instance must be scoped to your class*/

fileWatcher!.event = { event in
    Swift.print(self?.someVariable)//Outputs: a variable in your current class
    Swift.print(event.description)//Outputs: a description of the file change
}

1

ऑटोमेटर में एक प्रकार का वर्कफ़्लो होता है, जिसे "फ़ोल्डर एक्शन" कहा जाता है, जो किसी फ़ोल्डर में कुछ जोड़ने पर स्वचालित रूप से चलता है। एक बनाएं, फिर "रन शैल स्क्रिप्ट" क्रिया का उपयोग करें।


4
धन्यवाद, लेकिन ऐसा प्रतीत होता है कि "फ़ोल्डर क्रियाएँ" केवल तभी चालू होती हैं जब किसी फ़ाइल को फ़ोल्डर में जोड़ा जाता है, न कि जब किसी मौजूदा फ़ाइल की जाँच की जाती है।
लुई बी।

ओह ठीक है। माफ़ करना।
टिमोथी मुलर-हार्डर

0

आप कुछ इस तरह की कोशिश करना चाह सकते हैं:

touch /tmp/dirb.tmp
while true do 
  ls /thedirtocheck > /tmp/dira.tmp 
  diff /tmp/dira.tmp /tmp/dirb.tmp || echo "something changed" 
  cp /tmp/dira.tmp /tmp/dirb.tmp 
  sleep 100 
done

आपको ls -lफ़ाइल परिवर्तनों को भी कम से कम पकड़ने की आवश्यकता है ।
nohillside

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