OS X और Ubuntu पर रियल टाइम में फाइलसिस्टम देखें


11

मैं एक सीएलआई टूल की तलाश कर रहा हूं, जो एक डायरेक्टरी को देखेगा और वास्तविक समय में बदलने वाली फाइलों के नामों को थूक देगा।

some_watch_command /path/to/some/folder | xargs some_callback

मैं inotify( inotify-tools?) के बारे में जानता हूं और ऐसा लगता है कि मुझे क्या चाहिए, लेकिन मुझे कुछ ऐसा चाहिए जो दोनों लिनक्स (मेरे मामले में उबंटू) और ओएससी संगत हो।

इसे तेज़ बिजली की ज़रूरत नहीं है, लेकिन इसे परिवर्तनों पर ट्रिगर करने की आवश्यकता है (एक सेकंड के भीतर उचित है)। इसके अलावा, मुझे आवश्यक नहीं कि ऊपर वर्णित सीएलआई कार्यक्रम की आवश्यकता है। यदि कुछ अंतर्निहित तकनीक मौजूद है और दोनों प्लेटफार्मों पर आसानी से स्क्रिप्ट करने योग्य है जो बहुत अच्छा होगा।


1
मुझे fswatchOS X पसंद है जो मुझे एक ऐसे प्रश्न पर मिला था जिसे डुप्लिकेट के रूप में टैग किया गया था - superuser.com/questions/445907/…
cwd

जवाबों:


11

OS X आमतौर पर इस कार्य के लिए Folder Actions या Launchd का उपयोग करेगा ।

एकमात्र क्रॉस-प्लेटफ़ॉर्म टूल जो मुझे पता है कि पायथन के लिए वॉचडॉग एपीआई है (इस प्रकार ओएस एक्स और लिनक्स के लिए उपलब्ध है)। pip(या easy_install) के माध्यम से इसे स्थापित करें

pip install watchdog

यह watchmedoकमांड लाइन टूल के साथ आता है , जो आपको सिस्टम ईवेंट पर शेल कमांड चलाने की अनुमति देता है। इसके सामान्य सिंटैक्स की जाँच करेंwatchmedo --help

यहाँ एक छोटा उदाहरण है, जहाँ आप आसानी से कमांड को संशोधित कर सकते हैं और मार्ग बोल्ड में हाइलाइट कर सकते हैं:

वॉचमेडो शेल-कमांड \
    - व्यापक
    --कमांड = ' प्रतिध्वनि "$ {watch_src_path}" \
     / कुछ / फ़ोल्डर

यह बस सभी परिवर्तित फ़ाइलों या फ़ोल्डरों के लिए पथ को थूक देगा, जिससे आप watchmedoकिसी अन्य शेल कमांड में आउटपुट कर सकते हैं।


ऐसा लगता है कि फ़ोल्डर क्रियाओं की कुछ सीमाएँ हैं (और OSX के बिना परीक्षण करना कठिन है), लेकिन watchmedoमेरे लिए पूरी तरह से काम कर रहा है। धन्यवाद!
एड्रियन श्नाइडर

2

मैंने कुछ रूबी लिपियों को ट्विक किया है जो मैं देख रहा हूं कि आप क्या देख रहे हैं। यहाँ रूबी कोड है:

#!/usr/bin/ruby
# Inspired by http://vikhyat.net/code/snippets/#watchfile

# How to use:
# This script takes two paramaters:  a folder and a shell command
# The script watches for when files in the folder are changed.  When they are, the shell command executes
# Here are some shortcuts you can put in the shell script:
# %F = filename (with extension)
# %B = base filename (without extension)


unless ARGV.length == 2
  puts "\e[32m    Usage: \e[0mruby OnSaveFolder.rb 'folder' 'command'"
  exit
end

require 'digest/md5'
require 'ftools'

$md5 = ''
$directory = File.expand_path(ARGV[0])
$contents = `ls #{$directory}`
$contentsList = $contents.split("\n")
$fileList = []


Dir.chdir($directory)

for i in $contentsList
  if ( File.file?(File.expand_path(i)) == true)
    $fileList.push(i)
  end
end

$processes = []

def watch(file, timeout, &cb)
  $md5 = Digest::MD5.hexdigest(File.read(file))
  loop do
    sleep timeout
    if ( temp = Digest::MD5.hexdigest(File.read(file)) ) != $md5
      $md5 = temp
      cb.call(file)
    end
  end
end

puts "\e[31m Watching files in folder \e[34m #{$directory}"
puts "\e[32m    Press Control+C to stop \e[0m"

for i in $fileList
  pid = fork do
    $num = 0
    $filePath = File.expand_path(i)

    watch i, 1 do |file|
      puts "\n     #{i} saved"

      $command = ARGV[1].dup
      if ( ARGV[1].include?('%F') )
        $command = $command.gsub!('%F', i)
      end
      if ( ARGV[1].include?('%B') )
        $command = $command.gsub!('%B', File.basename(i, '.*'))
      end

      $output = `#{$command}`
      if ( $output != '')
        puts "\e[34m     #{$command}\e[31m output: \e[0m"
        puts $output
      end
      puts "\e[34m     #{$command}\e[31m finished \e[0m (#{$num}, #{Time.now})\n"
      $num += 1

    end
  end
  $processes.push(pid)
end

Process.wait(pid)

for i in $processes
  `kill #{i}`
end

मैंने इस स्क्रिप्ट को "OnSaveFolder.rb" नाम दिया है। यह दो पैरामीटर लेता है: फ़ोल्डर जिसे आप बदलावों के लिए देखना चाहते हैं, और जब आप बदलाव चाहते हैं तो bash कोड चलाना चाहते हैं। उदाहरण के लिए,

ruby OnSaveFolder.rb '/home/Movies' 'echo "A movie has been changed!"'

आशा है कि ये आपकी मदद करेगा! मैंने पाया है कि इस प्रकार की चीज़ के लिए माणिक बहुत अच्छी तरह से काम करता है, और यह डिफ़ॉल्ट रूप से ओएस एक्स पर स्थापित है।


यह एक शॉट दिया है, लेकिन किसी भी रूबी पृष्ठभूमि के बिना एक छोटे से मुश्किल करने के लिए। फिर भी धन्यवाद!
एड्रियन श्नाइडर

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

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

2

आप lsofएक watchकमांड में रख सकते हैं और इसे हर <s>सेकंड अपडेट कर सकते हैं :

watch -n <s> lsof

और जो भी फ़िल्टर के साथ लॉन्च करें, जैसे कि pid1, pid2, pid3 और pid4 को अनदेखा करना

lsof -p "pid1,pid2,pid3,^pid4"

यदि यह पर्याप्त नहीं है, तो आप हमेशा grep के साथ अपने फ़िल्टर लिख सकते हैं।

OS X के लिए, इस प्रश्न के उत्तर देखें।


0

entr अच्छा है। आप इसे देखने के लिए इच्छित सटीक फ़ाइलों को फ़िल्टर कर सकते हैं।

find . -name '*.py' | entr python runTests.py

यदि आप चाहते हैं कि यह केवल एक निर्देशिका के अंदर कुछ फ़ाइलों की निगरानी करें, तो आप अपनी findकमांड को शिल्प कर सकते हैं ताकि यह केवल उन फाइलों को वापस कर दे जिन्हें आप देखना चाहते हैं।

मुझे इससे कॉन्फ़िगर करना आसान लगता है fswatch

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