我有一系列文件,只要其中一个文件得到更新,我就需要'cat'。例如,假设我们有fileA.txt,fileB.txt和fileC.txt。当修改fileA.txt并保存文件时,我需要运行一个其他任务
的脚本cat fileA.txt fileB.txt fileC.txt > combined.txt
我知道这涉及到观看文件,但我不确定如何处理这个问题。当我处理这些文件时,观察脚本将始终运行,然后在修改一组文件中的一个文件时执行'cat'命令。我在Mac上,如果这是用shell写的,我更喜欢。
谢谢!
答案 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.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)
答案 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