2011-08-16 18 views
3

我有一系列的文件,我需要'貓',只要其中一個文件得到更新。例如,假設我們有fileA.txt,fileB.txt和fileC.txt。當fileA.txt被修改和保存文件我需要運行一個腳本,其他任務將外殼腳本,監視特定文件的變化,然後貓它們

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

我知道有看文件這個交易,但我不確定如何處理這個。當我處理這些文件時,監視腳本將始終運行,然後在修改一組文件中的某個文件時執行'cat'命令。我在Mac上,並希望如果這是寫在shell中。

謝謝!

回答

2

免責聲明:這可能是矯枉過正,但另一方面可能更快實施和更穩定。

有一個名爲directory_watcher的ruby庫,它可以監視目錄的變化。

一個簡單的腳本,如

#!/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 

可以讓你開始。這裏修改(或刪除或添加)的文件名只是打印到標準輸出。


這裏是一個example script,將觀看file1.txtfile2.txtfile3.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

This works great!謝謝你miku! – jaysonp

0

您可能能夠利用尾巴。

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

會將寫入到f1.txt和f2.txt的新行添加到c.txt中。爲避免c.txt與標題混雜在一起,請使用:

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