Shell脚本监视特定文件的更改,然后监视它们

时间:2011-08-16 18:23:53

标签: macos shell watch

我有一系列文件,只要其中一个文件得到更新,我就需要'cat'。例如,假设我们有fileA.txt,fileB.txt和fileC.txt。当修改fileA.txt并保存文件时,我需要运行一个其他任务

的脚本
cat fileA.txt fileB.txt fileC.txt > combined.txt

我知道这涉及到观看文件,但我不确定如何处理这个问题。当我处理这些文件时,观察脚本将始终运行,然后在修改一组文件中的一个文件时执行'cat'命令。我在Mac上,如果这是用shell写的,我更喜欢。

谢谢!

2 个答案:

答案 0 :(得分: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

可以帮助你入门。这里修改(或删除或添加)的文件名只是打印到stdout。


以下是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)

答案 1 :(得分: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