क्या हर बार किसी फ़ाइल को किसी विशिष्ट फ़ोल्डर में बदलने के लिए (टर्मिनल) कमांड को स्वचालित रूप से चलाने का एक सरल तरीका है?
यह कमांड लाइन, या सिस्टम में निर्मित एप्लिकेशन, कोई तृतीय-पक्ष एप्लिकेशन के माध्यम से संभव होना चाहिए।
कोई विचार?
क्या हर बार किसी फ़ाइल को किसी विशिष्ट फ़ोल्डर में बदलने के लिए (टर्मिनल) कमांड को स्वचालित रूप से चलाने का एक सरल तरीका है?
यह कमांड लाइन, या सिस्टम में निर्मित एप्लिकेशन, कोई तृतीय-पक्ष एप्लिकेशन के माध्यम से संभव होना चाहिए।
कोई विचार?
जवाबों:
इस तरह एक संपत्ति सूची सहेजें ~/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
अधिक जानकारी के लिए।
entr (1) फ़ाइलों को बदलने पर कमांड चलाने के लिए एक उपयोगिता है। यह STDIN पर फ़ाइल की एक सूची पढ़ता है और मतदान से बचने के लिए kqueue (2) का उपयोग करता है ।
उदाहरण:
ls my_project/*.html | entr echo "file changed"
आप फ़ोल्डर क्रियाओं का उपयोग कर सकते हैं, जो आपको फ़ोल्डर में सामग्री को बदलने पर स्वचालित (स्क्रिप्ट) निष्पादित करने देता है। जहाँ तक मुझे पता है, Automator में एक टेम्पलेट है जो आपको आसानी से एक नया फ़ोल्डर एक्शन बनाने और वांछित फ़ोल्डर में संलग्न करने की सुविधा देता है। और "रन शैल स्क्रिप्ट" कार्रवाई जोड़कर, आपको बस वांछित प्रभाव प्राप्त करना चाहिए।
जब फ़ाइल को जोड़ा या संशोधित किया जाता है, तो ट्रिगर के लिए फ़ोल्डर क्रियाएं ठीक होती हैं।
हालाँकि, यदि आपकी बदली हुई परिभाषा में फ़ाइल हटाना शामिल है, तो OSX फ़ोल्डर क्रियाओं का पता नहीं लगता है कि कोई फ़ाइल निकाली गई है या नहीं।
प्रश्न का उत्तर देने के लिए:
FileWatcher निर्भरता को यहाँ से डाउनलोड करें: https://github.com/eonist/swift-utils
कॉमांडलाइन में तेजी से चलने के साथ अपने आप को परिचित करें: http://krakendev.io/blog/scripting-n-ift
फ़ोल्डर देखने के लिए इस कोड का उपयोग करें।
कोड:
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
}
ऑटोमेटर में एक प्रकार का वर्कफ़्लो होता है, जिसे "फ़ोल्डर एक्शन" कहा जाता है, जो किसी फ़ोल्डर में कुछ जोड़ने पर स्वचालित रूप से चलता है। एक बनाएं, फिर "रन शैल स्क्रिप्ट" क्रिया का उपयोग करें।
आप कुछ इस तरह की कोशिश करना चाह सकते हैं:
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
फ़ाइल परिवर्तनों को भी कम से कम पकड़ने की आवश्यकता है ।