0

我在家里使用 linux 服务器将我的照片以全分辨率存储在一个名为 pics/FULL 的目录中。为了通过我的 dlna-server (minidlna) 加快交付速度,我准备了第二个 dir pics/SMALL 具有相同的子目录名和相同的文件名。但是此目录中的所有图片都以较小的分辨率转换。我通过一个创建 SMALL 的小脚本做到了这一点,然后遍历 FULL 中的所有子目录并转换每张图片。

但 FULL 是我的主要目录。因此,如果我更改图片或路径(删除、旋转、向现有子目录添加一个附加目录、移动图片等),我总是在 pics/FULL 中执行此操作。现在我需要一个脚本,它只检测 SMALL 和 FULL 之间的变化(例如,新图片/子目录、具有比 SMALL 中的相同图片更新的 FULL 时间戳的图片)。该脚本应每晚运行。

我可以编写一个脚本(更喜欢 Ruby)来做到这一点,但我想知道是否已经有一种方法或 gem 可以做到这一点?类似于 rsync 没有应对差异但为每个差异调用一个脚本?

也许有人对现有脚本有很好的提示?

汤姆

4

1 回答 1

0

我建议使用rb-inotify gem(它是 linux inotify内核子系统的包装器,它为您的应用程序提供有关文件系统更改的事件)。

使用它,您可以监视您的FULL目录并将每个操作镜像到SMALL目录中。

以下存根应该可以帮助您:

require 'rb-inotify'

notifier = INotify::Notifier.new
# you might want events like :moved_to etc. - have a look at the documentation :)
notifier.watch("path/to/FULL", :create, :modify, :delete) do |e|
  puts e.absolute_name # gives you the absolute path to the file/directory, which caused the event
  puts e.flags # gives you the event types that caused this event (e.g. :modified)
  if e.flags.include? :create
    if e.flags.include? :isdir
      # create matching dir in SMALL
    else
      # create new image in SMALL
    end
  elsif e.flags.include? :modify
    # generate new SMALL image if it's not a dir
  elsif e.flags.include? :deleted
    # delete matching dir/file in SMALL
  end
end

notifier.run # loops forever and waits for filesystem events
# alternatively use
notifier.process # blocks untils first filesystem changes was processed

请查看gem 文档inotify 文档(查看哪些事件类型是可能的)。

于 2013-08-11T21:02:13.283 回答