OS X verwendet normalerweise Ordneraktionen oder Launchd für diese Aufgabe.
Das einzige plattformübergreifende Tool, das ich kenne, ist die Watchdog-API für Python (also verfügbar für OS X und Linux). Installieren Sie es über pip
(oder easy_install
)
pip install watchdog
Es kommt mit dem watchmedo
Befehlszeilentool, mit dem Sie Shell-Befehle bei Systemereignissen ausführen können. Überprüfen Sie die allgemeine Syntax mit watchmedo --help
Hier ist ein kurzes Beispiel, wo Sie den Befehl und den fett hervorgehobenen Pfad leicht ändern könnten:
watchmedo shell-command \ --recursive \ --command='echo "${watch_src_path}"' \ /some/folder
Dies würde einfach die Pfade zu allen geänderten Dateien oder Ordnern ausspucken, sodass Sie watchmedo
weiterleiten können 's-Ausgabe an einen anderen Shell-Befehl.
Ich habe einige Ruby-Skripte, auf die ich gestoßen bin, optimiert, 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 #{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
Ich habe dieses Skript "OnSaveFolder.rb" genannt. Es benötigt zwei Parameter:den Ordner, den Sie auf Änderungen überwachen möchten, und den Bash-Code, den Sie ausführen möchten, wenn es eine Änderung gibt. 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.
Sie könnten lsof
eingeben in eine watch
Befehl und aktualisieren Sie ihn alle <s>
Sekunden:
watch -n <s> lsof
und starten Sie das mit einem beliebigen Filter, z. B. Beobachten von PID1, PID2, PID3 und Ignorieren von PID4
lsof -p "pid1,pid2,pid3,^pid4"
Wenn das nicht genug ist, können Sie mit grep immer noch Ihre eigenen Filter schreiben.
Für OS X siehe die Antworten zu dieser Frage.