Сценарий оболочки, который отслеживает изменения в определенных файлах, а затем отслеживает их - PullRequest
3 голосов
/ 16 августа 2011

У меня есть ряд файлов, которые мне нужно «катать» всякий раз, когда один из файлов обновляется.Например, скажем, у нас есть fileA.txt, fileB.txt и fileC.txt.Когда fileA.txt изменен и файл сохранен, мне нужно запустить скрипт, который среди прочих задач будет

cat fileA.txt fileB.txt fileC.txt > combined.txt

Я знаю, что это относится к просмотру файлов, но я не уверен, как к этому подойти.Сценарий наблюдения всегда будет работать, когда я работаю с этими файлами, а затем выполняю команду 'cat', когда один из файлов в наборе файлов изменяется.Я на Mac и предпочел бы, если это написано в оболочке.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Отказ от ответственности: это может быть излишним, но, с другой стороны, может быть быстрее для реализации и более стабильным.

Существует рубиновая библиотека с именем directory_watcher , которая может отслеживать каталоги на наличие изменений.

Простой скрипт, такой как

#!/usr/bin/env ruby

require 'rubygems'
require 'directory_watcher'

dw = DirectoryWatcher.new '.'
dw.add_observer do
  |*args| args.each do |event| 
    puts event
  end
end

dw.start
gets      # when the user hits "enter" the script will terminate
dw.stop

может помочь вам начать. Здесь измененные (или удаленные или добавленные) имена файлов просто выводятся на стандартный вывод.


Вот пример примера сценария , который будет следить за file1.txt, file2.txt, file3.txt. Всякий раз, когда один из них изменяется, он объединяет их в files-combined.txt.

#!/usr/bin/env ruby

require 'rubygems'
require 'directory_watcher'

dw = DirectoryWatcher.new '.'
dw.interval = 1.0
dw.add_observer do |*args| 
  args.each do |event| 
    if /file\d/ =~ event.path
      `cat file1.txt file2.txt file3.txt > files-combined.txt`
      puts "#{Time.now.strftime("%I:%M:%S")} \
        Created files-combined.txt (since #{event.path} #{event.type})"
    end
  end
end

dw.start
gets      # when the user hits "enter" the script will terminate
dw.stop

Вывод будет выглядеть так:

$ ruby 7083085.rb 
08:55:47 Created files-combined.txt (since ./file3.txt added)
08:55:47 Created files-combined.txt (since ./file1.txt added)
08:55:47 Created files-combined.txt (since ./file2.txt added)
08:55:54 Created files-combined.txt (since ./file1.txt modified)
08:55:57 Created files-combined.txt (since ./file1.txt modified)
0 голосов
/ 17 августа 2011

Возможно, вы сможете использовать хвост.

tail -f f1.txt f2.txt >> c.txt

добавит новые строки, которые записаны в f1.txt и f2.txt в c.txt. Чтобы избежать путаницы c.txt с заголовками, используйте:

tail -qf f1.txt f2.txt >> c.txt
...