Sehen Sie sich das Dateisystem in Echtzeit unter OS X und Ubuntu an

6506
Adrian Schneider

Ich suche nach einem CLI-Tool, das ein Verzeichnis überwacht und die Namen von Dateien herausspuckt, die sich in Echtzeit ändern.

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

Ich kenne inotify( inotify-tools?) Und es scheint, was ich brauche, aber ich brauche etwas, das sowohl Linux (in meinem Fall Ubuntu) als auch OSX-kompatibel ist.

Es muss nicht blitzschnell sein, muss aber bei Änderungen ausgelöst werden (innerhalb einer Sekunde ist es sinnvoll). Ich benötige auch nicht unbedingt das oben erwähnte genaue CLI-Programm. Wenn es einige zugrunde liegende Technologien gibt, die auf beiden Plattformen problemlos skriptfähig sind, wäre das ebenfalls großartig.

11
Ich mag "fswatch" für OS X, das ich auf einer Frage gefunden habe, die als Duplikat markiert wurde - http://superuser.com/questions/445907/monitor-a-folder-osx-for-file-changes-then-run -a-bash-script cwd vor 11 Jahren 1

4 Antworten auf die Frage

11
slhck

Normalerweise verwendet OS X für diese Aufgabe Folder Actions oder Launchd .

Das einzige Cross-Plattform-Tool, das ich kenne, ist die Watchdog-API für Python (also für OS X und Linux verfügbar). Installiere es durch pip(oder easy_install)

pip install watchdog 

Es wird mit dem watchmedoBefehlszeilentool geliefert, mit dem Sie Shell-Befehle für Systemereignisse ausführen können. Überprüfen Sie die allgemeine Syntax mitwatchmedo --help

Hier ist ein kurzes Beispiel, in dem Sie den Befehl und den fett hervorgehobenen Pfad leicht ändern können:

watchmedo Shell-Befehl \ --rekursiv \ --command = ' echo "$ " \ \ some / Ordner 

Dadurch werden einfach die Pfade zu allen geänderten Dateien oder Ordnern ausgespuckt, sodass Sie die watchmedoAusgabe an einen anderen Shell-Befehl übergeben können.

Anscheinend haben Folder Actions einige Einschränkungen (und sind ohne OSX schwer zu testen), aber "watchmedo" funktioniert perfekt für mich. Vielen Dank! Adrian Schneider vor 11 Jahren 0
2
speedofmac

Ich habe einige Ruby-Skripte verbessert, die ich gefunden habe, um genau das zu tun, wonach Sie suchen. Hier ist der Ruby-Code:

#!/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 # 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}, #)\n" $num += 1  end end $processes.push(pid) end  Process.wait(pid)  for i in $processes `kill #` end 

Ich habe dieses Skript "OnSaveFolder.rb" genannt. Es sind zwei Parameter erforderlich: der Ordner, den Sie auf Änderungen überwachen möchten, und den Bash-Code, den Sie bei einer Änderung ausführen möchten. Zum Beispiel,

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

Ich hoffe das hilft! Ich habe festgestellt, dass Ruby für diese Art von Dingen sehr gut funktioniert und standardmäßig unter OS X installiert ist.

Es gab einen Schuss, aber ein bisschen schwer ohne Ruby Hintergrund zu optimieren. Danke trotzdem! Adrian Schneider vor 11 Jahren 0
das ist toll. eine Idee, wie man es macht, um Ordner unten rekursiv anzusehen? Nate Flink vor 10 Jahren 0
Wenn ich mich nicht für die Ausführung des Befehls bei Änderungen interessiere, wäre das plattformübergreifend oder nur Unix? Und ist es eigentlich Echtzeit? Einige Aktenbeobachter haben eine lächerliche Verzögerung (Minuten). Automatico vor 10 Jahren 0
2
DDay

Sie könnten lsofeinen watchBefehl eingeben und ihn alle <s>Sekunden aktualisieren lassen :

watch -n <s> lsof 

und starten Sie das mit einem beliebigen Filter, z. B. pid1, pid2, pid3 und ignorieren von pid4

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

Wenn das nicht genug ist, können Sie Ihre eigenen Filter immer mit grep schreiben.

Sehen Sie sich für OS X die Antworten dieser Frage an .

0
Christian Long

entr ist nett. Sie können genau die Dateien filtern, die Sie sehen möchten.

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

Wenn nur bestimmte Dateien in einem Verzeichnis überwacht werden sollen, können Sie den findBefehl so gestalten, dass nur die Dateien zurückgegeben werden, die Sie überwachen möchten.

Ich finde es einfacher zu konfigurieren als fswatch.