日付をもとに、ファイル名を変更し画像サイズを変えて、コピーする プログラム


「車輪の再発明」にはなるけど、ファイルの日付を当てにして ファイル名をyyyy-mm-dd-n.jpgに変更して、ついでに 画像のサイズを176x144に変換して、指定のディレクトリに 納める、というスクリプトを書いた。
ImageMagickがインストールされていたらconvertで、画像サイズを 176x144に変換してくれます。

http://nais.to/~yto/tools/file2date/にもあるのは分かっていましたが、まぁ 勉強のつもりで。

#!/usr/bin/ruby

# file name: datefilename
# first date: 2005 03 01
# function: chenging file name from date
# Usage: datefilename [file name] [directory]
# Ex: P1001000.JPG -> 2006-03-09-1.jpg

require "fileutils" # fileutilsライブラリを使用する

# 変数初期化
debug = false
$im_conv="convert"
$size="-resize 176x144"
$create_date = Time.new
$new_file_name = Array.new
$src_file_name = Array.new
$fcnt = 0
$stamp = Time.new
$seq_num = 0


# 日付ファイル名を配列に入れる
ARGV.each do |a_file|
  # 指定されたPATH(ファイル名含む)がファイルであることを確認
  if(FileTest.file?(a_file)) then 
    # ファイルの更新時間を取得
    $create_date = File.mtime(a_file)
    
    # 同じ日付のファイルがあったら連番をふる
    if($create_date.strftime("%x") == $stamp.strftime("%x")) then $seq_num+=1
    else $seq_num = 1 end
    $stamp = $create_date

    # 日付からファイル名を取得
    $src_file_name << a_file
    $new_file_name << sprintf("%s-%d.jpg",$create_date.strftime("%Y-%m-%d"),$seq_num)
    print $src_file_name[$fcnt]," -> " if(debug) 
    print $new_file_name[$fcnt],"\n" if(debug) 
    $fcnt+=1

  elsif(FileTest.directory?(a_file)) then
    # ディレクトリだったら、ディレクトリ変数に格納
    $dir = a_file
    print "directory : ",a_file,"\n" if(debug) 
  end
end


# 日付ファイル名にして、ファイルをコピー
$cnt = 0
while ($cnt < $fcnt) do
  print $cnt,":",$fcnt,"\n" if(debug)
  # ImageMagicのconvertを使って、画像の大きさを176x144にする
  system(sprintf("%s %s %s %s",$im_conv,$size,$src_file_name[$cnt],$new_file_name[$cnt]))
  # ファイルコピー
  FileUtils.mv($new_file_name[$cnt],$dir)
  print "convert ",$src_file_name[$cnt]," -> ",$dir,$new_file_name[$cnt],"\n"
  $cnt+=1
end
printf("copy %d files\n",$fcnt)
# おわり


拡張子のチェックや、本当にそれが画像ファイルなのかのチェックもしていま せんが、自分専用ということで。

解決したかったのは、画像のファイル名、サイズ、勝手にコピーをしてくれた らな、と思って。
たぶん、日付のあたりだけをなんとかすれば、shell scriptでもよい気がして 来た。


Kenichi Kitazawa
Last modified: Tue May 30 17:39:26 JST 2006