ওএস এক্স এবং উবুন্টুতে রিয়েল টাইমে ফাইল সিস্টেম দেখুন


11

আমি একটি সি এল এল সরঞ্জামের সন্ধান করছি যা একটি ডিরেক্টরি দেখবে এবং ফাইলগুলির নাম রিয়েল টাইমে পরিবর্তিত করবে।

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

আমি inotify( inotify-tools?) সম্পর্কে অবগত এবং এটি আমার যা প্রয়োজন তা মনে হয় তবে আমার এমন কিছু প্রয়োজন যা লিনাক্স (আমার ক্ষেত্রে উবুন্টু) এবং ওএসএক্স সামঞ্জস্যপূর্ণ।

এটি দ্রুত বজ্রপাতের প্রয়োজন নেই, তবে পরিবর্তনের উপর এটি ট্রিগার করতে হবে (এক সেকেন্ডের মধ্যে যুক্তিসঙ্গত)। এছাড়াও, আমার অবশ্যই উপরে বর্ণিত সঠিক সি এল এল প্রোগ্রামের প্রয়োজন নেই। যদি কিছু অন্তর্নিহিত প্রযুক্তি উপস্থিত থাকে এবং উভয় প্ল্যাটফর্মে সহজেই স্ক্রিপ্টযোগ্য হয় তবে তা দুর্দান্ত great


1
আমি fswatchওএস এক্সের জন্য পছন্দ করি যা আমি এমন একটি প্রশ্নের সন্ধান পেয়েছি যা নকল হিসাবে ট্যাগ করা হয়েছিল - superuser.com/questions/445907/…
সিডব্লিউ

উত্তর:


11

ওএস এক্স সাধারণত এই কাজের জন্য ফোল্ডার ক্রিয়াগুলি বা লঞ্চ করা ব্যবহার করবে।

আমার জানা একমাত্র ক্রস প্ল্যাটফর্ম সরঞ্জামটি পাইথনের ওয়াচডোগ এপিআই (এটি ওএস এক্স এবং লিনাক্সের জন্য উপলভ্য)। এটি pip(বা easy_install) এর মাধ্যমে ইনস্টল করুন

pip install watchdog

এটি watchmedoকমান্ড লাইন সরঞ্জামের সাথে আসে যা আপনাকে সিস্টেমের ইভেন্টগুলিতে শেল কমান্ড চালানোর অনুমতি দেয়। এর সাথে এর সাধারণ বাক্য গঠন পরীক্ষা করুনwatchmedo --help

এখানে একটি সংক্ষিপ্ত উদাহরণ রয়েছে, যেখানে আপনি সহজেই কমান্ডটি এবং সাহসীভাবে হাইলাইট করা পথটি সংশোধন করতে পারেন:

ওয়াচমেডো শেল-কমান্ড \
    --পুনরাবৃত্তি \--কমন্ড 
    = ' প্রতিধ্বনি "$ {watch_src_path}" ' \
     / কিছু / ফোল্ডার

এটি সহজেই সমস্ত পরিবর্তিত ফাইল বা ফোল্ডারগুলির পাথগুলি সরিয়ে ফেলবে, watchmedoআপনাকে অন্য শেল কমান্ডের পাইপ আউটপুট দেয়।


দেখে মনে হচ্ছে ফোল্ডার অ্যাকশনগুলির কিছু সীমাবদ্ধতা রয়েছে (এবং ওএসএক্স ছাড়াই পরীক্ষা করা শক্ত) তবে 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"। এটি দুটি প্যারামিটার লাগে: আপনি যে ফোল্ডারটি পরিবর্তনগুলির জন্য দেখতে চান এবং যখন পরিবর্তন আসে তখন আপনি যে বাশ কোডটি চালাতে চান তা লাগে। উদাহরণ স্বরূপ,

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

আশা করি এটা কাজে লাগবে! আমি খুঁজে পেয়েছি যে রুবি এই ধরণের জিনিসটির জন্য খুব ভাল কাজ করে এবং এটি ডিফল্টভাবে ওএস এক্সে ইনস্টল করা হয়েছে।


এটি একটি শট দিয়েছে তবে কোনও রুবি ব্যাকগ্রাউন্ড ছাড়াই টুইঙ্ক করা সামান্য কঠিন। যাই হোক ধন্যবাদ!
অ্যাড্রিয়ান স্নাইডার

এটা অসাধারণ. এটিকে কীভাবে নীচে নীচে পুনরাবৃত্তভাবে দেখা যায় তা সম্পর্কে কোনও ধারণা?
নেট ফ্লিঙ্ক 19

আমি যদি পরিবর্তনের আদেশটি কার্যকর করার বিষয়ে চিন্তা না করি, তবে এটি মাল্টি-প্ল্যাটফর্ম, বা কেবল ইউনিক্স হবে? এবং এটি কি আসল সময়? কিছু ফাইল পর্যবেক্ষক সেখানে একটি হাস্যকর দেরি (মিনিট) রয়েছে।
অটোম্যাটিকো

2

আপনি lsofএকটি watchআদেশ দিতে পারেন এবং এটি প্রতি <s>সেকেন্ডে আপডেট করতে পারেন :

watch -n <s> lsof

এবং যে ফিল্টার যেমন পিড 1, পিড 2, পিড 3 এবং পিড 4 উপেক্ষা করে তা চালু করুন

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

যদি এটি পর্যাপ্ত না হয় তবে আপনি সর্বদা গ্রেপ দিয়ে নিজের ফিল্টার লিখতে পারেন।

ওএস এক্স এর জন্য এই প্রশ্নের উত্তর দেখুন।


0

এন্টার ভাল। আপনি এটি দেখতে চান এমন সঠিক ফাইলগুলি ফিল্টার করতে পারেন।

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

যদি আপনি এটি কেবল কোনও ডিরেক্টরিতে থাকা নির্দিষ্ট ফাইলগুলি পর্যবেক্ষণ করতে চান তবে আপনি আপনার findআদেশটি তৈরি করতে পারেন যাতে এটি কেবল যে ফাইলগুলি আপনি দেখতে চান তা ফিরিয়ে দেয়।

এর চেয়ে কনফিগার করা আমার কাছে সহজ মনে হয়েছে fswatch

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.