2011年6月13日月曜日

重複ファイルを探す on Ruby



重複ファイルを探すツールがほしいけど、なんか探すがめんどくなって作ってみた。


目的は、ディスク容量節約のために、アホなファイルの重複を探す事。


なので、比較的速度重視小さいファイルは無視するようにしてます。(というか小さいファイルを探し出すと.svnファイルがたくさんひっかかる)


この程度の処理ぐらいシェルスクリプトで書けるようになりたいなぁ。






#!/usr/local/bin/ruby
# -*- coding: undecided -*-
require 'digest/md5'
require 'pathname'
$minFileSize=30*1024*1024 #これより小さいふぁいるは検索対象外

$fileHash=Hash.new
def getHash(dir)
$stderr.puts dir
dir.each_entry do |file|
next if(file.to_s=="." || file.to_s=="..")
path=dir+file
if(path.file?)then
next if(path.size<$minFileSize)
begin
digest=Digest::MD5.new.update(path.read(512))
key="#{path.size}#{digest}"
$fileHash[key]=Array.new if($fileHash[key]==nil)
$fileHash[key].push(path)
rescue
end
elsif(path.directory?)then
begin
getHash(path)
rescue
end
end
end
end

def checkDiff(files)
differ=Array.new
same=Array.new
base=files.shift
same.push(base)

files.each do |target|
if(system("diff","-q",base.to_s,target.to_s))then
same.push(target)
else
$stderr.puts "=============================="
differ.push(target)
end
end
return [same,differ]
end

getHash(Pathname.new(ARGV[0]))
$fileHash.each do |k,v|
while(1<v.size) do
t=checkDiff(v)
v=t[1]
if(1<t[0].size)then
puts t[0]
puts "================================"
end
end
end





0 件のコメント:

コメントを投稿