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

.logbook

学んだことを書き綴る、言わば航海日誌です。

デジカメ写真を日付別にフォルダ分けするRubyスクリプトを作成してみた

Ruby

我が家ではデジカメやスマホで撮影した写真をNASに保存し、PCやスマホから閲覧可能にしている。フォルダは日付別に分けて整理しているが、数カ月分の写真をまとめて吸い出すことも多く、手動での整理に限界が来つつあった。

大抵のファイルシステムであればファイルそのものに作成時刻(≒撮影日時)が付与されているので、この情報を読み出してフォルダ分けを自動化できると考えた。

参考情報

既に同様のプログラムが紹介されていたので参考にした

Rubyでファイル/ディレクトリを年ごとに整理 - yuuponの日記

仕様

ファイルを整理したいディレクトリにて作成したRubyスクリプトを実行する。

f:id:ylgbk:20150503142404p:plain

全てのファイルが、年/日付毎のフォルダに整理される。

ファイルの日付と作成時刻が合っていないファイルが混じっていても、あくまで作成時刻を基準に選別している。

f:id:ylgbk:20150503142415p:plain

f:id:ylgbk:20150503142430p:plain

日付フォルダの末尾に「_iPhone5s」といったデバイス名を付与しているが、こういった仕様も簡単にカスタマイズできる。そう、Rubyならね。

尚、実行環境がWindowsであればRubyInstaller for Windowsをインストールし、.rbと関連付けしておくことで、当該スクリプトをダブルクリックするだけで実行できる。

スクリプト

以下に作成したRubyスクリプトを掲載する。

rearrange.rb

#!/usr/bin/ruby

require 'fileutils'

SEPARATOR = "/"
DEVICE_NAME = "iPhone5s"

# Dirクラス
class Dir
  # mkdir -p に相当
  def self.mkdir_r path
    base = Dir.pwd
    path.partition(SEPARATOR).each do |s|
      if s != SEPARATOR
        if !(Dir.exists? s)
          Dir.mkdir s
        end
        Dir.chdir s
      end
    end
    Dir.chdir base
  end
  # ファイル整理
  def rearrange!
    self.each do |file|
      # 本スクリプトは整理対象から外す
      if File.absolute_path(file) != File.absolute_path(__FILE__)
        # ディレクトリは整理対象から外す
        if !(File.directory?(file))
          # 撮影時刻を取得し、パスを生成する
          time = File.mtime(file)
          path = time.strftime("%Y")
          path = path + SEPARATOR + time.strftime("%Y%m%d_" + DEVICE_NAME)
          
          # フォルダを生成する
          Dir.mkdir_r path

          # ファイルを移動する
          path = path + SEPARATOR + file
          File.rename file, path 
        end
      end
    end
  end
end

# カレントディレクトリに対してファイル整理を実行する
Dir.new(Dir.pwd).rearrange!.close