Ruby でバックアップ・プログラムを書きました。バックアップ先のフォルダがバックアップ元のフォルダの中身と再帰的に同じ内容になるようにします。なので、バックアップ先にあってバックアップ元の中身にないファイルやフォルダは(バックアップ先で)削除されるので注意して下さい。「削除がされない」バージョンは下のリンク先にあります。
再帰的なファイルのバックアップ(Ruby) - Camera Obscura
なお、機械的なコピーではありません。変更があった部分のみ処理します。基本的に Linux 向けで、Windows ではファイルの日付の考え方が Linux とはちがうので、期待した動作をしません。
使い方はこんな感じです。backup('バックアップ元', 'バックアップ先')
backup('/home/***/Documents', '/media/***/MyHDD/Documents')
backup.rb
require 'fileutils' def backup(snd, rsv) #String{snd, rsv} -> String{r_fn[], s_fn[], s, r}, Time{mts, mtr} 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