読者です 読者をやめる 読者になる 読者になる

ディレクトリのバックアップ-削除あり(Ruby)

Ruby PC・ウェブその他

Ruby でバックアップ・プログラムを書きました。バックアップ先のフォルダがバックアップ元のフォルダの中身と再帰的に同じ内容になるようにします。なので、バックアップ先にあってバックアップ元の中身にないファイルやフォルダは(バックアップ先で)削除されるので注意して下さい。「削除がされない」バージョンは下のリンク先にあります。
再帰的なファイルのバックアップ(Ruby) - Camera Obscura

なお、機械的なコピーではありません。変更があった部分のみ処理します。基本的に Linux 向けで、Windows ではファイルの日付の考え方が Linux とはちがうので、期待した動作をしません。
 
使い方はこんな感じです。backup('バックアップ元', 'バックアップ先')

backup('/home/***/Documents', '/media/***/MyHDD/Documents')

 
 
backup.rb

require 'fileutils'

def backup(snd, rsv)
  Dir.chdir(rsv); r_fn = Dir.glob("*")
  Dir.chdir(snd); s_fn = Dir.glob("*")

  r_fn.each do |fname|
    unless s_fn.include?(fname)
      FileUtils.rm_r(File.join(rsv, fname))
      puts "delete: #{fname}"
    end
  end

  s_fn.each do |fname|
    s = File.join(snd, fname); r = File.join(rsv, fname)
    mts = File.stat(s).mtime; mtr = nil
    mtr = File.stat(r).mtime if r_fn.include?(fname)
    if FileTest.directory?(s)
      if r_fn.include?(fname)
	backup(s, r) if mts > mtr and FileTest.directory?(r)
      else
        puts "folder copy: #{fname}"
        FileUtils.cp_r(s, r)
      end
    elsif !r_fn.include?(fname) or mts > mtr
      puts "file copy: #{fname}"
      FileUtils.cp(s, r)
    end
  end
end