3

我有一系列文件,只要其中一个文件得到更新,我就需要“分类”。例如,假设我们有 fileA.txt、fileB.txt 和 fileC.txt。修改 fileA.txt 并保存文件后,我需要运行一个脚本,该脚本将在其他任务中

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

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

谢谢!

4

2 回答 2

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

可以让你开始。在这里,修改(或删除或添加)的文件名只是打印到标准输出。


这是一个示例脚本,它将监视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)
于 2011-08-16T18:33:35.883 回答
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
于 2011-08-17T09:55:30.510 回答