फ़ाइल परिवर्तन पर नज़र रखने और कमांड निष्पादित करने के लिए स्क्रिप्ट को बैश करें


12

मेरे पास सबफ़ोल्डर्स के झुंड के साथ एक फ़ोल्डर है, इन फ़ोल्डरों ने विस्तार के asciidoctorसाथ .adocफाइल किया है।

हर बार जब मैंने फाइलों में बदलाव किया (जो अक्सर होता है) मुझे चलाने की जरूरत है

asciidoctor -q filename.adoc

इसे HTML फॉर्मेट में संकलित करने के लिए।

मैं इस प्रक्रिया को स्वचालित करने की कोशिश कर रहा हूं। अब तक मैं entr का उपयोग करके इस के साथ आया हूँ :

ls *.adoc | entr asciidoctor -q *.adoc

लेकिन केवल सबफ़ोल्डर के लिए मौजूदा फ़ोल्डर के साथ काम करता है। मैंने इस बदलाव की कोशिश की है, लेकिन यह काम नहीं करता है:

find . -name '*.adoc' | entr asciidoctor -q *.adoc

किसी भी विचार मैं सभी सबफ़ोल्डर्स के लिए इस स्वचालित प्रक्रिया को कैसे लागू कर सकता हूं?


जवाबों:


17

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

sudo apt-get install inotify-tools

inotify-toolsप्रदान करता है inotifywaitऔर inotifywatchबायनेरिज़, हमें पहले वाले की आवश्यकता है।


इसलिए आप asciidoctor -q some_fileकिसी भी .adocफाइल को संशोधित करने पर कमांड चलाना चाहते हैं ( some_fileउस से बदल दिया जाएगा), यदि ऐसा है तो मान लें कि आपकी .adocफाइलें निर्देशिका में हैं /foo/bar, आप घड़ी सेट कर सकते हैं:

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc
  • -qशांत मोड को सक्षम करता है, inotifywaitस्वयं से कोई जानकारी नहीं

  • -m मॉनिटर मोड को सक्षम करता है, अन्यथा यह पहली घटना के बाद बाहर निकल जाएगा

  • --event modify, हम केवल modifyइवेंट में रुचि रखते हैं यानी जब कोई फाइल संशोधित होती है। अन्य संभावित मूल्यों में शामिल हैं open, closeआदि।

  • --format %w, हम केवल उस फ़ाइल का नाम चाहते हैं जिसे अन्य जानकारी के बजाए संशोधित किया गया है क्योंकि हम फ़ाइल नाम का उपयोग किसी अन्य कमांड के इनपुट के रूप में करेंगे

  • /foo/bar/*.adocनिर्देशिका के .adocतहत सभी फ़ाइलों के लिए विस्तारित किया जाएगा/foo/bar


अब ऊपर आपको फ़ाइल नाम दिखाएगा जब भी कोई संशोधित किया जाता है, अब फ़ाइल नाम पर कमांड को चलाने के लिए (यह मानते हुए कमांड एसटीडीआईएन के माध्यम से तर्क लेता है):

inotifywait -qm --event modify --format '%w' /foo/bar/*.adoc | asciidoctor -q

आप निर्देशिका पर एक पुनरावर्ती घड़ी भी सेट कर सकते हैं, आपको तब grepकेवल वांछित फ़ाइलों को फ़िल्टर करने के लिए उपयोग करने की आवश्यकता होगी । यहाँ -rनिर्देशिका पर पुनरावर्ती रूप से ( ) सेट करना /foo/barऔर grepकेवल .adocफ़ाइलों को फ़िल्टर करने के लिए उपयोग करना :

inotifywait -qrm --event modify --format '%w%f' /foo/bar | grep '\.adoc$' | asciidoctor -q

जब निर्देशिकाओं को देखते हुए आउटपुट स्वरूप निर्दिष्ट होता है %w, तो वह निर्देशिका नाम के रूप में होता है, इसलिए हमें %fफ़ाइल नाम प्राप्त करने की आवश्यकता होती है। फाइलें देखते समय, %fखाली स्ट्रिंग को हल करेगा।

ध्यान दें, आप inotifywaitडेमॉन ( -d) मोड में भी चला सकते हैं , आप पूरी चीज़ को स्क्रिप्ट भी कर सकते हैं, और / या बैकग्राउंड में चला सकते हैं, और / या इसके साथ और भी अन्य विकल्प खेल सकते हैं।

इसके अलावा, asciidoctorयदि आप चाहें, तो आप अपनी पसंद के किसी भी अन्य कमांड से बदल सकते हैं।

man inotifywaitअधिक विचार प्राप्त करने के लिए जाँच करें ।


धन्यवाद यह काम किया। मैं भी OSX के लिए कुछ इसी तरह। लेकिन मुझे लगता है कि यह पूछने के लिए सही जगह नहीं है।
चोकर

@bran हाँ, IMHO UL में जाएं , आप इसे संदर्भ के रूप में उपयोग कर सकते हैं।
heemayl

महान जवाब, बस एक मामूली सुधार। -q कार्यक्रम को "कम क्रिया" बनाता है, -qq (डबल q) घातक त्रुटियों को छोड़कर इसे पूरी तरह से चुप कर देता है।
जोताडेपीस

4

उपयोग करना inotifywaitएक विशिष्ट दृष्टिकोण है, लेकिन एक अलग उपयोगिता भी है जिसे कहा जाता है inotify-hookableकि बस आपको एक कमांड चलाने की अनुमति मिलती है जब एक फ़ाइल (या निर्देशिका) बदल जाती है:

inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'

यह एक बार कमांड को ट्रिगर करने के बाद बाहर निकलने लगता है; मुझे लगातार देखने का विकल्प नहीं दिखता है, इसलिए आप कुछ ऐसा कर सकते हैं:

while true; do
    inotify-hookable -f filename.adoc -c 'asciidoctor -q filename.adoc'
    echo "== $(date) : executed, continuing to monitor..."
done

नोट फ़ाइलों या रास्तों को अनदेखा करने के लिए कई फ़ाइलों या एक निर्देशिका, पुनरावर्ती और विकल्पों पर नज़र रखने के विकल्प हैं।


inotify-hookable मेरे लिए कमांड चलाने के बाद बाहर नहीं निकलता है। हम्म
मैक्स

inotify-hookable को एक अलग पैकेज से स्थापित किया गया है:sudo apt-get install inotify-hookable
ब्रूनो सिल्वानो

3

वहाँ कई उपकरण हैं, खासकर यदि आप अपने भंडार के माध्यम से खोज करते हैं

apt-cache search monitor | grep file

जो हमें कई उपकरण देता है। लेकिन आपको उनका परीक्षण करने की आवश्यकता नहीं है क्योंकि मैंने ऐसा किया है।

मैंने इन उपकरणों और कई अन्य लोगों का परीक्षण किया है:

  • inotify
  • fswatch
  • filewatch
  • नमूना
  • fileschanged
  • entr

इन उपकरणों में से मुझे तीन उपयोगी और विश्वसनीय लगे:

  • direvent | जीएनयू सी में लिखा
  • आईवाच | पर्ल में
  • fsniper

और इन तीनों के बीच, direvent कोई संदेह नहीं है के साथ सबसे अच्छा है।

यह उपयोग करने के लिए इतना उपयोगी और विश्वसनीय है कि मैंने इसका उपयोग मेरे पास मेरे माइक्रोसर्विसेस के साथ एक साधारण पाइपलाइन के लिए किया है।

direvent.conf देखने के लिए फ़ाइल

syslog {
    facility local0;
    tag "direvent";
    print-priority yes;
}

watcher {
    path /var/www/html/ir/jsfun/build/react recursive;
    file "*.js";
    event write;
    command "/usr/bin/xdotool search --onlyvisible  --class firefox key F5";
    option (stdout, stderr, wait);
}

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

whileलूप या अन्य सामान का उपयोग करने की आवश्यकता नहीं है ।


विशेषताएं

  • एक निर्देशिका देख पुनरावृत्ति
  • डेमॉन के रूप में अग्रभूमि या पृष्ठभूमि में चलाया जा सकता है
  • पोर्टेबल। मेरे पास उबंटू में और साथ ही CentOS7 सर्वर है
  • फ़ाइल नाम रिपोर्ट
  • फ़ाइल मिलान का समर्थन करने के लिए regex
  • mulit- फ़ाइल देखना (अधिक देखें तो केवल एक प्रकार की फ़ाइल)
  • कमांड निष्पादन को सिंक्रोनाइज़ करें (यदि हमारे पास मल्टी-वॉचर है)
  • syslog हैंडलिंग (अगर हम चाहते हैं तो लॉग इन करें)
  • साथ काम करने के लिए आसान और अच्छा सीएलआई और कॉन्फिग फाइल डिजाइन

सर्गेई पॉज़्न्याकॉफ़ द्वारा विकसित ।


स्थापित कर रहा है

sudo apt install direvent

लेकिन इसके स्रोत कोड का उपयोग करके इसे स्थापित करना बहुत आसान और सीधा है जो आपको अंतिम संस्करण देता है (अभी है: 5.1)।


-3

वैसे मैं निम्नलिखित सलाह देता हूं।

#!/bin/bash
#Script
for SRC in *.adoc; 
      do
      asciidoctor -q $SRC
  done

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