OS X ve Ubuntu'da Dosya Sistemini Gerçek Zamanlı İzleyin


11

Bir dizini izlemek ve gerçek zamanlı olarak değişen dosyaların adlarını tükürmek bir CLI aracı arıyorum.

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

Biliyorum inotify( inotify-tools?) Ve ihtiyacım olan şey gibi görünüyor, ama hem Linux (benim durumumda Ubuntu) hem de OSX uyumlu bir şeye ihtiyacım var.

Hızlı yıldırım olması gerekmez, ancak değişiklikler üzerine tetiklenmesi gerekir (bir saniye içinde makul). Ayrıca, yukarıda belirtilen tam CLI programına da ihtiyacım yok. Altta yatan bir teknoloji varsa ve her iki platformda da kolayca yazılabilirse, bu da harika olurdu.


1
fswatchYinelenen olarak etiketlenmiş bir soruda bulduğum OS X'i beğendim - superuser.com/questions/445907/…
cwd

Yanıtlar:


11

OS X genellikle bu görev için Klasör Eylemleri veya Launchd kullanır.

Bildiğim tek çapraz platform aracı Python için bekçi köpeği API'sidir (bu nedenle OS X ve Linux için kullanılabilir). pip(Veya easy_install) üzerinden yükleyin

pip install watchdog

watchmedoSistem olaylarında kabuk komutlarını çalıştırmanıza izin veren komut satırı aracı ile birlikte gelir . Genel sözdizimini şununla kontrol edin:watchmedo --help

Komutu ve kalın olarak vurgulanan yolu kolayca değiştirebileceğiniz kısa bir örnek:

watchmedo kabuk komutu \
    --onaylayıcı \
    --command = ' echo "$ {watch_src_path}" ' \
     / some / folder

Bu, tüm değiştirilen dosya veya klasörlerin yollarını tükürür watchmedove başka bir kabuk komutuna çıkış vermenizi sağlar .


Klasör Eylemlerinin bazı sınırlamaları var gibi görünüyor (ve OSX olmadan test edilmesi zor), ancak watchmedobenim için mükemmel çalışıyor. Teşekkürler!
Adrian Schneider

2

Tam olarak aradığınızı yapmak için karşılaştığım Ruby senaryolarını değiştirdim. İşte Ruby kodu:

#!/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

Bu komut dosyasına "OnSaveFolder.rb" adını verdim. İki parametre alır: değişiklikleri izlemek istediğiniz klasör ve değişiklik olduğunda çalıştırmak istediğiniz bash kodu. Örneğin,

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

Umarım bu yardımcı olur! Ruby'nin bu tür şeyler için çok iyi çalıştığını ve varsayılan olarak OS X'e yüklendiğini buldum.


Bir şans verdim ama Ruby arka planı olmadan ince ayar yapmak biraz zor. Yine de teşekkürler!
Adrian Schneider

bu harika. nasıl aşağıdaki klasörleri özyinelemeli izlemek için herhangi bir fikir?
Nate Flink

Değişiklik komutunun yürütülmesini umursamıyorsam, bu çok platformlu mu yoksa sadece unix mi? Ve aslında gerçek zamanlı mı? Bazı dosya gözlemcileri saçma bir gecikmeye (dakika) sahiptir.
Automatico

2

Sen koyabilirsiniz lsofbir içine watchkomuta ve her güncelleme gelmiş <s>saniyede:

watch -n <s> lsof

ve pid1, pid2, pid3 izlemek ve pid4'ü yoksaymak gibi herhangi bir filtreyle başlatın

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

Bu yeterli değilse, her zaman grep ile kendi filtrelerinizi yazabilirsiniz.

OS X için bu sorunun yanıtlarına bakın.


0

entr güzel. İzlemesini istediğiniz dosyaları bu şekilde filtreleyebilirsiniz.

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

Yalnızca bir dizindeki belirli dosyaları izlemesini istiyorsanız, findkomutunuzu yalnızca izlemek istediğiniz dosyaları döndürecek şekilde oluşturabilirsiniz.

Yapılandırmayı daha kolay buluyorum fswatch.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.