それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

[]ハードディスク内の重複ファイルを探す。

よく同じファイルが別名で存在することがよくある!。プロジェクトのドキュメントを扱っていると、これがよくある。多人数になればなるほど、みんなが適当にバックアップ・コピー取って編集するので、同じファイルが大量に出てきて焦る。

写真も別名で出てくる定番ですね。

バックアップ的なものなバージョン管理でやればいいと思うのですが。重複ファイルが出てきてしまった以上仕方ない。重複ファイルを探して消して回るしか無い。

重複ファイルを探すスクリプト

ハードディスクの重複ファイルを探すスクリプト作った。

#!/usr/bin/env ruby
## ** coding:utf-8
#
#
dir_name = ARGV[0] if ARGV.size > 0
dirname ||="."

dirname= File.expand_path(dirname)


require 'tempfile'
tmpfile = Tempfile.new("md5_sum")
IO.popen("find '#{dirname}'  -type f -exec md5sum {} \\;  "){|f|
	until f.eof?
		str =  f.readline
		tmpfile.puts str
		puts str
	end
}

tmpfile.close
puts "--"*20
tmpfile.open
#ソート
#puts `sort #{tmpfile.path}`
IO.popen("sort #{tmpfile.path}"){|f|
	until f.eof?
		str =  f.readline
		tmpfile.puts str
		puts str
	end

}

puts "--"*20
tmpfile.close
list = tmpfile.open.readlines.map{|e| e.split }
hash_list = list.map{|e| e.first}

puts hash_list
puts "--"*20
dups = hash_list.uniq.select{|i| hash_list.index(i) != hash_list.rindex(i)}
puts dups
puts "--"*20
puts "重複一覧"
puts "--"*20

list.select{|e| puts e.join("\t") if dups.select{|i| e.first =~ /#{i}/}.size>0 } 

実行結果

----------------------------------------
重複一覧
----------------------------------------
b8641b41c4e8d81aaab2daf84898391d	/Users/takuya/Desktop/構造体、共用体、列挙	2.txt
b8641b41c4e8d81aaab2daf84898391d	/Users/takuya/Desktop/構造体、共用体、列挙	3.txt
b8641b41c4e8d81aaab2daf84898391d	/Users/takuya/Desktop/構造体、共用体、列挙	4.txt
b8641b41c4e8d81aaab2daf84898391d	/Users/takuya/Desktop/構造体、共用体、列挙	5.txt
b8641b41c4e8d81aaab2daf84898391d	/Users/takuya/Desktop/構造体、共用体、列挙	6.txt
b8641b41c4e8d81aaab2daf84898391d	/Users/takuya/Desktop/構造体、共用体、列挙.txt


全てをRubyでやろうとすると md5 digest や IO が時間がかかる。時間もったいない。

2018-08-03

記述ミスを修正