OS XおよびUbuntuでリアルタイムのファイルシステムを見る


11

ディレクトリを監視し、リアルタイムで変更されるファイルの名前を吐き出すCLIツールを探しています。

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

私は知っていますinotifyinotify-tools?)、それは私が必要なもののようですが、Linux(私の場合はUbuntu)とOSXの両方の互換性があるものが必要です。

超高速である必要はありませんが、変更時にトリガーする必要があります(1秒以内であれば妥当です)。また、上記の正確なCLIプログラムは必ずしも必要ではありません。基盤となる技術が存在し、両方のプラットフォームで簡単にスクリプト化できる場合、それも素晴らしいでしょう。


1
以下のような私fswatch-私は重複としてタグ付けされた問題で見つかったOS X用superuser.com/questions/445907/...
CWD

回答:


11

OS Xは通常、このタスクにフォルダーアクションまたは起動を使用します。

私が知っている唯一のクロスプラットフォームツールは、Python用のウォッチドッグAPIです(したがって、OS XとLinuxで利用可能です)。pip(またはeasy_install)からインストールします

pip install watchdog

watchmedoコマンドラインツールが付属しており、システムイベントでシェルコマンドを実行できます。で一般的な構文を確認してくださいwatchmedo --help

以下は、コマンドと太字で強調表示されたパスを簡単に変更できる短い例です。

watchmedoシェルコマンド\
    -再帰\
    --command = ' echo "$ {watch_src_path}" ' \
     / some / folder

これにより、変更されたすべてのファイルまたはフォルダーへのパスが単純に吐き出され、パイプwatchmedoの出力を別のシェルコマンドに渡すことができます。


Folder Actionsにはいくつかの制限があるように見えますが(OSXなしではテストするのは困難です)、watchmedo私にとっては完璧に機能しています。ありがとう!
エイドリアンシュナイダー

2

探しているものを正確に実行するために、出会ったRubyスクリプトを調整しました。Rubyコードは次のとおりです。

#!/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」という名前を付けました。2つのパラメーターが必要です。変更を監視するフォルダーと、変更があったときに実行するbashコードです。例えば、

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

これがお役に立てば幸いです!rubyはこのタイプの場合に非常にうまく機能し、デフォルトでOS Xにインストールされていることがわかりました。


試してみましたが、Rubyの背景なしで微調整するのは少し難しいです。とにかくありがとう!
エイドリアンシュナイダー

これは素晴らしい。以下のフォルダを再帰的に監視する方法はありますか?
ネイトフリンク

変更時のコマンドの実行を気にしない場合、これはマルチプラットフォームですか、それともUNIXのみですか?それは実際にリアルタイムですか?そこにいる一部のファイルウォッチャーにはとんでもない遅延(分)があります。
自動

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.