blog.takuyan.com

Ruby & Javascript & Hack

指定フォルダ配下のomaファイルを抹殺

我が家では音楽ファイルは、ひとつのフォルダにまとめて格納されています。
どのくらいまとまっているかというと、SonicStageiTunesが同じフォルダを指してるカンジ。


最初使用していたSony SonicStageが初期設定で作り出すomaファイルと、
Apple iTunesが作り出すその他ファイルが同じフォルダ内に展開されるという
祭りの状態だったので、せめて、omaファイルだけでも除去しようと考えまして、
ぐだぐだとスクリプト組んだので、備忘録までに。

require 'find'
require 'fileutils'

# コピー元フォルダ
dir1 = "\E:/music"
# コピー先フォルダ
dir_oma_temp = "\E:/temp/music"

# ログファイル名
log_path = dir_oma_temp + "/copy.log"
log = []

# ファイル数
count = 0

# コピー元パス=>ファイル名
h = Hash::new

# 指定フォルダ配下の指定ファイルを抽出
Find::find(dir1) do | path |
  if /\.oma$/ =~ path 
    /\/(\d*-.*\.oma$)/six =~ path # ここで拡張子omaを指定
    # 重複値の場合、文末に適当な数字を追記する
    if h::has_value?($1)
      h[path] = $1 + rand(10)::to_s
    else
      h[path] = $1
    end
  end
end

# TEMPフォルダ作成
FileUtils::mkdir_p(dir_oma_temp) if !File::exist?(dir_oma_temp)

# TEMPフォルダへ格納
h::each_key do | path |
  log << path
  FileUtils::install( path, dir_oma_temp + "/" + h[path] )
  count += 1
end

# コピー元のファイルを削除する
h::each_key do | path |
  FileUtils::rm(path)
end

# 空のディレクトリを削除する
Find::find(dir1) do | path |
  begin
    Dir::rmdir(path)
  rescue Errno::ENOTEMPTY, Errno::ENOTDIR
    next
  rescue
    break
  end
end

# ログ出力
File::open(log_path, "w") do | io |
  io::puts "Total :#{count} files. #{log}"
end