ファイルをサーバーにアップロードするRubyスクリプト。
よく使うからメモっておく。
すべてのファイルをいつもアップロードしていると時間がかかってしょうがないので、タイムスタンプも取っておいて更新していないファイルはアップロードしない。
require "fileutils" require 'net/ssh' require 'net/sftp' require 'yaml' require 'time' # # タイムスタンプファイルを読み込む # def load_timestamp(filename) timestamps = Hash.new timestamps = YAML.load(File.open(filename, "r").read) if FileTest.exist?(filename) return timestamps end # # 更新されたファイルかどうか # def is_updated(old_str_stamp, new_str_stamp) return true if old_str_stamp==nil old_date = Time.parse(old_str_stamp).to_i new_date = Time.parse(new_str_stamp).to_i # 5秒以上経過していたら更新対象とする return true if 5<(new_date-old_date) return false end # # ファイルをアップロードする # def upload_files(server, account, password, port, files, remote_dir, timestamps) session = Net::SSH.start(server, account, {:port => port, :password => password}); mySftp = session.sftp.connect # create directory mySftp.mkdir(remote_dir) # copy files files.each do |file| remote_name = file.gsub(base_dir, remote_dir) old_str_stamp = timestamps[remote_name] new_str_stamp = File.stat(file).mtime.strftime "%Y-%m-%d %H:%M:%S" if is_updated(old_str_stamp, new_str_stamp) if FileTest.directory?(file) mySftp.mkdir(remote_name) else mySftp.upload!(file, remote_name) timestamps[remote_name] = new_str_stamp puts "#{file} => #{remote_name}" end end end # end of files.each end # # タイムスタンプを書き換える # def write_timestamp(filename, timestamps) File.open(timestamps_txt, "w"){ |f| timestamps.each_pair{ |key,value| f.puts "#{key}: \"#{value}\"" } } end # ------------------------------------------------------ # ------------------------------------------------------ server = '123.456.789.123' account = 'user' password = 'ABCDEFG' port = 1234 files = Dir.glob('data/**/*') remote_dir = '/var/www/html/data/' timestamp_name = "timestamps.txt" timestamps = load_timestamp(timestamp_name) upload_files(server, account, password, port, files, remote_dir, timestamps) write_timestamp(timestamp_name, timestamps)