क्या मैक पर "वॉच" या "इनोटिफ़ाइवाइट" जैसी कमांड है?


287

मैं अपने मैक (स्नो लेपर्ड) पर एक फोल्डर देखना चाहता हूं और फिर एक स्क्रिप्ट निष्पादित करता हूं (यह फ़ाइल के नाम को दे रहा था जिसे केवल एक फ़ोल्डर में ले जाया गया था (एक पैरामीटर के रूप में ... x.sh "फ़ाइल नाम")।

मेरे पास एक स्क्रिप्ट है जो बैश (x.sh) में लिखी गई है, जो इनपुट 1 पर कुछ फाइलों और अन्य सामानों को स्थानांतरित कर देगी। मुझे बस फाइल नाम देने के लिए OSX की जरूरत है, जब नई फाइलें / फोल्डर को स्थानांतरित किया जाता है / dir में बनाया जाता है।

ऐसी कोई आज्ञा?


1
आपको पूछना चाहिए कि ड्रॉपबॉक्स कैसे करता है क्योंकि संभवतः वे सभी उपलब्ध विकल्पों की कोशिश करते हैं।
जेफ बर्गज ने

2
@JeffBurdges मुझे यकीन नहीं है कि यह एक आसान उपक्रम होगा। हालाँकि, मैं कहूँगा कि Apple के FSEvents संदर्भ को खत्म करने के बाद अगर ड्रॉपबॉक्स इसका उपयोग नहीं कर रहा था तो यह वास्तव में मूर्खतापूर्ण होगा। fswatchUtil प्रस्तुत के रूप में एक जवाब नीचे तथ्य उपयोग इस विधि में करता है।
स्टीवन लू

जवाबों:


447

fswatch

fswatch एक निर्देशिका पर नजर रखने के लिए Mac OS X FSEvents API का उपयोग करके एक छोटा प्रोग्राम है। जब उस निर्देशिका में किसी भी परिवर्तन के बारे में एक घटना प्राप्त होती है, तो निर्दिष्ट शेल कमांड द्वारा निष्पादित किया जाता है/bin/bash

यदि आप GNU / Linux पर हैं, तो inotifywatch ( inotify-toolsअधिकांश वितरण पर पैकेज का हिस्सा ) समान कार्यक्षमता प्रदान करता है।

अद्यतन: fswatch अब बीएसडी, डेबियन और विंडोज सहित कई प्लेटफार्मों में उपयोग किया जा सकता है।

सिंटेक्स / एक सरल उदाहरण

नया तरीका जो कई पथ देख सकता है - संस्करण 1.x और उससे अधिक के लिए :

fswatch -o ~/path/to/watch | xargs -n1 -I{} ~/script/to/run/when/files/change.sh

नोट: यदि नहीं है, तो कमांड -oके अंत तक नंबर आउटपुट xargsकमांड के अंत में जुड़ जाएगा -I{}। यदि आप उस नंबर का उपयोग करना चुनते हैं, तो {}अपनी आज्ञा में कहीं भी रखें।

संस्करणों के लिए पुराना तरीका 0.x :

fswatch ~/path/to/watch ~/script/to/run/when/files/change.sh

Homebrew के साथ स्थापना

9/12/13 के अनुसार इसे होमब्रे में वापस जोड़ा गया - yay! इसलिए, अपनी सूत्र सूची ( brew update) अपडेट करें और फिर आपको बस इतना करना है:

brew install fswatch

Homebrew के बिना स्थापना

इन कमांड को टाइप करें Terminal.app

cd /tmp
git clone https://github.com/alandipert/fswatch
cd fswatch/
make
cp fswatch /usr/local/bin/fswatch

यदि आपके पास cआपके सिस्टम पर कोई कंपाइलर नहीं है, तो आपको Xcode या Xcode कमांड लाइन टूल - दोनों मुफ्त में इंस्टॉल करने की आवश्यकता हो सकती है। हालाँकि, अगर ऐसा है, तो आपको शायद होमब्रे को देखना चाहिए ।

fswatchसंस्करण 1.x के लिए अतिरिक्त विकल्प

Usage:
fswatch [OPTION] ... path ...

Options:
 -0, --print0          Use the ASCII NUL character (0) as line separator.
 -1, --one-event       Exit fsw after the first set of events is received.
 -e, --exclude=REGEX   Exclude paths matching REGEX.
 -E, --extended        Use exended regular expressions.
 -f, --format-time     Print the event time using the specified format.
 -h, --help            Show this message.
 -i, --insensitive     Use case insensitive regular expressions.
 -k, --kqueue          Use the kqueue monitor.
 -l, --latency=DOUBLE  Set the latency.
 -L, --follow-links    Follow symbolic links.
 -n, --numeric         Print a numeric event mask.
 -o, --one-per-batch   Print a single message with the number of change events.
                       in the current batch.
 -p, --poll            Use the poll monitor.
 -r, --recursive       Recurse subdirectories.
 -t, --timestamp       Print the event timestamp.
 -u, --utc-time        Print the event time as UTC time.
 -v, --verbose         Print verbose output.
 -x, --event-flags     Print the event flags.

See the man page for more information.

आपके निर्देश या होमब्रे के बिना स्थापित करना किसी भी अधिक काम नहीं करता है। makeमेकफाइल नहीं मिलने के बारे में एक त्रुटि। सौभाग्य से, मैकवेर्ट्स पर अब फ़ॉस्वाच हो गया है, इसलिए sudo port install fswatchहम उन लोगों के लिए काम करते हैं, जो होमब्रे के बजाय मैकपोर्ट का उपयोग करते हैं।
coredumperror

यदि आप स्थैतिक तर्क के साथ एक कमांड का उपयोग कर रहे हैं (उदाहरण के लिए, मैं src और परीक्षण परिवर्तनों पर अपनी इकाई परीक्षण चला रहा था) तो यह आपके लिए काम नहीं कर सकता है। यह प्रश्न ( stackoverflow.com/questions/25689589/… ) दूसरा टुकड़ा था जिसकी मुझे ज़रूरत थी।
जेस्कुलस्की

5
मैं तुम्हें वहाँ सुन:fswatch ./ | xargs -I{} cp {} ~/Dropbox/backup/latest/
fionbio

fswatch, entr या when_changed जैसे उपकरणों से बेहतर है, जिनके पास .IT डायरेक्टरी के साथ काम करते समय कुछ बग होते हैं। fswatch बहुत अधिक पेशेवर है। बस, आप बस fswatch .वर्तमान निर्देशिका की निगरानी करेंगे।
अनाम

मेरा सुझाव है fswatch -0 -v -o /path/to/watched/files | xargs -0 -n 1 -I {} [your command]साथ -0NULLs के लिए। यह मेरे लिए कम संकलन के लिए काम करता है
बोल्डनिक

95

आप उस उद्देश्य के लिए लॉन्चड का उपयोग कर सकते हैं । जब फ़ाइल पथ को संशोधित किया जाता है, तो प्रोग्राम को स्वचालित रूप से लॉन्च करने के लिए लॉन्च किया जा सकता है।

उदाहरण के लिए निम्न लॉन्चड कॉन्फिग प्लिस्ट प्रोग्राम लॉन्च करेगा /usr/bin/loggerजब मेरे उपयोगकर्ता खाते का डेस्कटॉप फोल्डर संशोधित किया गया है:

<?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>logger</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/logger</string>
        <string>path modified</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Users/sakra/Desktop/</string>
    </array>
</dict>
</plist>

Config plist को सक्रिय करने के लिए इसे अपने लाइब्रेरी फ़ोल्डर में LaunchAgents फ़ोल्डर में "logger.plist" के रूप में सहेजें।

शेल से आप तब launchctllogger.plist को सक्रिय करने के लिए कमांड का उपयोग कर सकते हैं :

$ launchctl load ~/Library/LaunchAgents/logger.plist

डेस्कटॉप फ़ोल्डर पर अब नजर रखी जा रही है। हर बार यह बदल जाता है कि आपको system.log (Console.app का उपयोग करें) में एक आउटपुट देखना चाहिए। Logger.plist को निष्क्रिय करने के लिए, चलाएँ:

$ launchctl unload ~/Library/LaunchAgents/logger.plist

ऊपर कॉन्फ़िगरेशन फ़ाइल WatchPathsविकल्प का उपयोग करता है । वैकल्पिक रूप से आप QueueDirectoriesविकल्प का उपयोग भी कर सकते हैं । देखें launchd अधिक जानकारी के लिए पेज।


1
क्या यह फ़ाइल सामग्री के साथ-साथ फ़ाइल पथ में परिवर्तन की निगरानी करने का एक तरीका है?
कैम

2
मुझे ऐसा नहीं लगता। आप उस उद्देश्य के लिए खुलने का उपयोग कर सकते हैं ।
साक्रा

1
मुझे यह काम करने के लिए मिला, लेकिन फिर जब मैंने /usr/bin/loggerअपनी बैश स्क्रिप्ट के साथ स्विच किया और "<string>path modified</strong>"प्रविष्टि को हटा दिया , तो मुझे अपने bash स्क्रिप्ट के लिए कोई भी रास्ता नहीं मिल सका, यह जानने के लिए कि मेरे डेस्कटॉप पर कौन सी फ़ाइल संशोधित की गई थी - बस वह घटना हुई। मैंने देखने की कोशिश की $0, $1और केवल स्क्रिप्ट नाम ही मिला, इस पर ध्यान नहीं दिया गया।
१६:०६ पर Volomike

जब यह परिवर्तन का पता लगाता है, तो केवल लॉन्च करने (और रुकने) के बजाय, क्या यह बात एक बार बदल जाती है? मैं इसके बजाय मांग पर काम करना चाहता हूं, मुझे बताए हुए लूप में नहीं चल रहा है, उदाहरण के लिए, 2 दिन पहले, मेरे डेस्कटॉप पर कुछ बदल गया है, जो लॉग इन में बार-बार लिख रहा है। तो, क्या हमें इस प्लिस्ट में कुछ प्रकार के अंतराल विकल्प का उपयोग करने की आवश्यकता है?
16

महान कार्य और स्पष्टीकरण
चेनस्माइल

37

होमब्रे के जरिए उपलब्ध फेसबुक का चौकीदार भी अच्छा लग रहा है। यह फ़िल्टरिंग का भी समर्थन करता है:

ये दो लाइनें एक स्रोत निर्देशिका पर एक घड़ी स्थापित करती हैं और फिर "बिल्डमे" नामक एक ट्रिगर स्थापित करती हैं जो जब भी CSS फ़ाइल बदली जाती है, तो "minify-css" नामक एक टूल चलाएगी। उपकरण को बदले हुए फ़ाइल नाम की एक सूची दी जाएगी।

$ watchman watch ~/src

$ watchman -- trigger ~/src buildme '*.css' -- minify-css

ध्यान दें कि मार्ग निरपेक्ष होना चाहिए।


1
यह अब तक का सबसे अच्छा उपकरण है।
बेंटऑन कोडिंग

1
यह एक बहुत अच्छा सा कार्यक्रम है: डॉक्स महान हैं, यह एक अनंत लूप नहीं खोलता है (जो कि फ़ॉस्वाच को ऐसा लगता है) और यह उन घड़ियों को याद करता है जो आपने रिबूट के बाद बनाई हैं और ऑटो उन्हें फिर से शुरू करता है।
ब्रैड

21

आप मेरे छोटे टूल पर एक नज़र डाल सकते हैं (और शायद विस्तार कर सकते हैं) kqwait। वर्तमान में यह बस के आसपास बैठता है और एक एकल फ़ाइल पर लिखने की घटना की प्रतीक्षा करता है, लेकिन kqueue वास्तुकला पदानुक्रमित घटना स्टैकिंग के लिए अनुमति देता है ...


पहाड़ के शेर पर अब तक काम करता है। बहुत अच्छा!
स्कॉट

तो यह वास्तव में बहुत बढ़िया है। मैं एक छोटे से मुद्दे के साथ भाग गया fswatch(जो ठीक भी है, क्योंकि इस तरह के एक प्रकाश आवरण के बाद इसे उचित काम करने के लिए संशोधित किया जा सकता है, मुझे यकीन है) जहां यह चीजों git statusको चलाते समय आग लग जाती है, जैसे (जो वास्तव में हर बार चला जाता है zsh प्रॉम्प्ट को मेरी मशीन पर प्रस्तुत किया गया है ...) जो वास्तव में इस विस्तृत स्क्रिप्ट को परिमार्जित करता है मेरे पास एक अंतहीन फीडबैक लूप बनाकर है। kqwait, हालांकि, परिवर्तित फ़ाइल के बारे में जानकारी प्रदान करता है, और इसके द्वारा ट्रिप नहीं किया जाता है git status। हालांकि मुझे यह लिखने की जरूरत है।
स्टीवन लू

2
$ brew install kqwait && while true; do kqwait doc/my_file.md; make; done
जोशुआ कुक

15

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


7

यह बस फाइलों को बदलने पर मनमाने आदेशों को चलाने के लिए OSX पर एक विकल्प के रूप में एनआरआर का उल्लेख करने के लिए है। मुझे यह सरल और उपयोगी लगता है।



3

संपादित करें: fsw में विलय कर दिया गया है fswatch। इस जवाब में, किसी भी संदर्भ को fswअब पढ़ना चाहिए fswatch

मैंने fswatchC ++ में एक प्रतिस्थापन लिखा है, fswजिसमें कई सुधार शामिल हैं:

  • यह एक GNU बिल्ड सिस्टम प्रोजेक्ट है जो किसी भी समर्थित प्लेटफॉर्म (OS X v।> = = 10.6) पर बनाता है

    ./configure && make && sudo make install
    
  • विभिन्न तर्कों के रूप में कई रास्ते पारित किए जा सकते हैं:

    fsw file-0 ... file-n 
    
  • यह इस तरह के रूप में सभी घटना की जानकारी के साथ एक विस्तृत रिकॉर्ड डंप करता है:

    Sat Feb 15 00:53:45 2014 - /path/to/file:inodeMetaMod modified isFile 
    
  • इसके आउटपुट को पार्स करना आसान है ताकि fswआउटपुट को किसी अन्य प्रक्रिया में पाइप किया जा सके।

  • विलंबता के साथ अनुकूलित किया जा सकता है -l, --latency
  • न्यूमेरिक ईवेंट फ्लैग को टेक्स्ट के बजाय लिखे जा सकते हैं -n, --numeric
  • समय प्रारूप के strftimeसाथ प्रारूप स्ट्रिंग का उपयोग करके अनुकूलित किया जा सकता है-t, --time-format
  • समय मशीन के स्थानीय समय (डिफ़ॉल्ट रूप से) या UTC समय के साथ हो सकता है -u, --utc-time

Fsw प्राप्त करना:

fswहै GitHub पर होस्ट और इसके संग्रह को क्लोनिंग प्राप्त किया जा सकता:

    git clone https://github.com/emcrisostomo/fsw

स्थापित करने की fsw:

fsw निम्नलिखित आदेशों का उपयोग करके स्थापित किया जा सकता है:

    ./configure && make && sudo make install

अग्रिम जानकारी:

मैंने एक परिचयात्मक ब्लॉग पोस्ट भी लिखा है जहाँ आप कुछ उदाहरणों के बारे में जान सकते हैं कि कैसे fswकाम करता है।


2

Apple OSX फ़ोल्डर क्रियाएँ आपको किसी फ़ोल्डर पर किए गए कार्यों के आधार पर कार्यों को स्वचालित करने की अनुमति देती हैं।


9
हाँ, मुझे पता है, कि मैंने कई बार उपयोग करने की कोशिश की, कभी भी सफलतापूर्वक इसे काम करने के लिए नहीं दिया, क्या आप मुझे एक उदाहरण दे सकते हैं?
मिंट

1
यह एक लिंक है, जवाब नहीं
दान Rosenstark

2

फ़ॉस्वाच का मेरा कांटा inotifywait -mथोड़ा कम (कोई प्रतीक्षा नहीं, और अधिक के साथ कार्यक्षमता प्रदान करता है ! मुझे लिनक्स पर बहुत अधिक परेशानी है inotifywait...) पार्स-फ्रेंडली आउटपुट।

यह मूल पर एक सुधार है fswatch क्योंकि यह STDOUT पर बदली हुई फ़ाइल का वास्तविक पथ भेजता है बजाय इसके कि आपको यह प्रोग्राम प्रदान करने की आवश्यकता है।

यह चट्टानी ठोस स्क्रिप्ट की एक श्रृंखला की नींव के रूप में ठोस है, जिसका उपयोग मैं सामान को स्वचालित करने के लिए करता हूं।

inotifywaitदूसरी ओर लिनक्स पर (यह ऑफ-टॉपिक है) , इसके शीर्ष पर कई प्रकार के कल्ज की आवश्यकता होती है और मैंने अभी भी इसे प्रबंधित करने का एक अच्छा तरीका नहीं निकाला है, हालांकि मुझे लगता है node.jsकि टिकट पर आधारित कुछ हो सकता है।


1
राइट, फोर्क का फोर्क। क्या यह Homebrew पर है?
फतुहोकू

1
जवाब न है; लेकिन वे इस पर काम कर रहे हैं । इसे वास्तव में जल्दी से स्थापित करने के लिए brew install https://raw.github.com/mlevin2/homebrew/116b43eaef08d89054c2f43579113b37b4a2abd3/Library/Formula/fswatch.rb
fatuhoku

1

मेरे पास इसके लिए एक GIST है और उपयोग बहुत सरल है

watchfiles <cmd> <paths...>

वर्णन करने के लिए, निम्नलिखित आदेश Hello Worldहर बार गूंजेंगे file1या file2बदलेंगे; और डिफ़ॉल्ट अंतराल चेक 1 सेकंड है

watchfiles 'echo Hello World' /path/to/file1 /path/to/file2 

अगर मैं हर 5 सेकंड की जांच करना चाहता हूं तो मैं -tध्वज का उपयोग कर सकता हूं

watchfiles -t 'echo Hello World' /path/to/file1 /path/to/file2 
  • -vउस verboseमोड को सक्षम करता है जो डिबग जानकारी दिखाता है
  • -qwatchfilesचुपचाप निष्पादित करता है ( #दिखाया जाएगा ताकि उपयोगकर्ता देख सकता है कि कार्यक्रम निष्पादित हो रहा है)
  • -qqwatchfilesपूरी तरह से चुपचाप निष्पादित करता है
  • -h मदद और उपयोग दिखाता है

https://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55


0

मैंने macOS के लिए यह करना समाप्त कर दिया। मुझे यकीन है कि यह कई मायनों में भयानक है:

#!/bin/sh
# watchAndRun
if [ $# -ne 2 ]; then
    echo "Use like this:"
    echo "   $0 filename-to-watch command-to-run"
    exit 1
fi
if which fswatch >/dev/null; then
    echo "Watching $1 and will run $2"
    while true; do fswatch --one-event $1 >/dev/null && $2; done
else
    echo "You might need to run: brew install fswatch"
fi

मैं कुछ समय के बिना fswatch सिंटैक्स का पता नहीं लगा सका। जो कष्टप्रद है और स्क्रिप्ट को रोकना कठिन बनाता है।
दान रोसेनस्टार्क

0

यदि आप NodeJS का उपयोग करना चाहते हैं, तो आप देखने के लिए चोकीदार (या चोकिदार-क्ली ) नामक पैकेज का उपयोग कर सकते हैं और फिर उपयोग कर सकते हैंrsync (मैक के साथ शामिल) का उपयोग कर सकते हैं:

रुपी आदेश:

$ rsync -avz --exclude 'some-file' --exclude 'some-dir' './' '/my/destination'

चोकीदार सीएलआई (एनपीएम के माध्यम से विश्व स्तर पर स्थापित):

chokidar \"**/*\" -c \"your-rsync-command-above\"


-3

यहां उन उपयोगकर्ताओं के लिए एक सरल सिंगल लाइन विकल्प है जिनके पास watchकमांड नहीं है जो हर 3 सेकंड में एक कमांड निष्पादित करना चाहते हैं:

while :; do your-command; sleep 3; done

यह एक अनंत लूप है जो मूल रूप से निम्नलिखित करने के समान है:

watch -n3 your-command


3
यह एक पुस्तकालय का उपयोग करने के समान नहीं है जो फ़ाइल सिस्टम से घटनाओं के लिए सुनता है। यदि आपके उदाहरण में, your-commandडिस्क I / O करता है, तो यह एक गारंटीकृत डिस्क है जो हर 3 सेकंड में पढ़ता / लिखता है - या हर घंटे 10,800 बार फाइलसिस्टम घटनाओं का उपयोग करके आपको गारंटी दी जाएगी कि I / O (और अन्य महंगे ऑपरेशन) केवल तभी होते हैं जब आप एक फाइल बदलते हैं (जो आम तौर पर एक घंटे में केवल दो बार होती है।)
Noah Sussman

सच है, और विचार करने के लिए अच्छा है। मुझे आमतौर पर watchअस्थायी मात्रा में चीजों के लिए यह देखने की जरूरत है कि कुछ क्या कर रहा है। मैं अपनी बताई गई तकनीक का उपयोग उत्पादन ऐप्स या उस जैसी किसी चीज़ के लिए नहीं करता। उदाहरण के लिए, मैं इसकी प्रगति देखना चाहता हूं dd, और मेरी तकनीक ऐसा करती है ( your-commandउचित संकेत भेजने के लिए उपयुक्त के रूप में प्रतिस्थापित करना dd)।
त्रिकूट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.