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