ディレクトリの保存

コピー先のディレクトリにコピー元のディレクトリ乃至ファイルがない場合、コピー先に再帰的にコピーします。コピー元になくても、コピー先のディレクトリ乃至ファイルを削除することはありません。また、ファイルが変更されているかは考慮しません。つまり、コピー先にないものを追加していくという感じです(いわゆるバックアップではありません(参照))。

Python版です。

import os
import glob
import shutil
import datetime

def fcopy(snd, rsv):
    os.chdir(rsv)
    r_fname = glob.glob('*')
    os.chdir(snd)
    for fname in glob.glob('*'):
        s = os.path.join(snd, fname)
        r = os.path.join(rsv, fname)
        if os.path.isdir(s):
            if fname in r_fname:
                if os.path.isdir(r):
                    fcopy(s, r)
            else:
                print("folder copy: %s" % (fname))
                shutil.copytree(s, r)
        elif not (fname in r_fname):
            if fname != "Thumbs.db":
                print("file copy: %s" % (fname))
                shutil.copyfile(s, r)

t = datetime.datetime.now()
print("copy start")
dir = ["/media/***/A/picture", "/media/***/B/picture"]
fcopy(dir[0], dir[1])
print( "\nRuntime: %.3f [sec]" % ((datetime.datetime.now() - t).total_seconds()) )

Ruby版です。

require 'fileutils'

def fcopy(snd, rsv)
  Dir.chdir(rsv)
  r_fname = Dir.glob("*")
  Dir.chdir(snd)
  Dir.glob("*").each do |fname|
    s = File.join(snd, fname)
    r = File.join(rsv, fname)
    if FileTest.directory?(s)
      if r_fname.include?(fname)
        fcopy(s, r) if FileTest.directory?(r)
      else
        puts "folder copy: #{fname}"
        FileUtils.cp_r(s, r)
      end
    elsif !r_fname.include?(fname)
      next if fname == "Thumbs.db"
      puts "file copy: #{fname}"
      FileUtils.cp(s, r)
    end
  end
end

t = Time.now
puts "copy start"
dir = ["/media/***/A/picture", "/media/***/B/picture"]
fcopy(dir[0], dir[1])
printf("\nRuntime: %.3f [sec]\n", Time.now - t)