GNU/Linux >> Tutoriels Linux >  >> Linux

Regarder le système de fichiers en temps réel sur OS X et Ubuntu

OS X utilise généralement des actions de dossier ou Lancer pour cette tâche.

Le seul outil multiplateforme que je connaisse est l'API watchdog pour Python (donc disponible pour OS X et Linux). Installez-le via pip (ou easy_install )

pip install watchdog

Il est livré avec le watchmedo outil de ligne de commande, qui vous permet d'exécuter des commandes shell sur des événements système. Vérifiez sa syntaxe générale avec watchmedo --help

Voici un court exemple, où vous pouvez facilement modifier la commande et le chemin mis en évidence en gras :

watchmedo shell-command \
    --recursive \
    --command='echo "${watch_src_path}"' \
    /some/folder

Cela recracherait simplement les chemins vers tous les fichiers ou dossiers modifiés, vous permettant de diriger watchmedo à une autre commande shell.


J'ai peaufiné certains scripts Ruby que j'ai rencontrés pour faire exactement ce que vous recherchez. Voici le code 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

J'ai nommé ce script "OnSaveFolder.rb". Il prend deux paramètres :le dossier dont vous souhaitez surveiller les modifications et le code bash que vous souhaitez exécuter en cas de modification. Par exemple,

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

J'espère que ça aide! J'ai trouvé que ruby ​​fonctionne très bien pour ce type de chose, et il est installé sur OS X par défaut.


Vous pourriez mettre lsof en watch commande et mettez-la à jour tous les <s> secondes :

watch -n <s> lsof

et lancez-le avec n'importe quel filtre, comme regarder pid1, pid2, pid3 et ignorer pid4

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

Si cela ne suffit pas, vous pouvez toujours écrire vos propres filtres avec grep.

Pour OS X, consultez les réponses à cette question.


Linux
  1. Scénarios Linux en temps réel et problèmes avec leurs solutions

  2. Sortie vers Stdout et en même temps Grep dans un fichier ?

  3. Créer et supprimer des fichiers d'échange dans Ubuntu

  4. Correctif du système de fichiers en lecture seule de la machine virtuelle Ubuntu ?

  5. Le temps d'accès au fichier ne se met pas à jour dans Ubuntu 12.04

Contrôlez l'utilisation de la RAM et du CPU par Kodi en temps réel

Système de fichiers Ubuntu 12.04.02 ?

3 façons de regarder les journaux en temps réel sous Linux

Comment vérifier la version d'Ubuntu - Méthodes rapides et faciles

Astuces Ubuntu :comment changer la date et l'heure sur un ordinateur portable ou un ordinateur de bureau

Comment partager un fichier entre Ubuntu et Windows 10 ?