From: Brian Candler Date: 2010-09-04T23:50:43+09:00 Subject: Re: Slow Find.find - real problem > Could you provide an example please? The basenames are all unique! Well, I guess you are doing a 'find' because the files are in various directories, and you don't know which file is in which directory. Otherwise, you'd be able to construct the path directly. So at the simplest I'm thinking of something like this: require 'find' base2path = {} Find.find("/etc") do |path| base2path[File.basename(path)] = path end # have a look at what you've built require 'pp' pp base2path You could add some logic to skip files you know are not of interest if you like. Then if the csv says it wants to rename foo.pdf, you look for base2path["foo.pdf"] to find its full path instantly. If you get nil, then it doesn't exist. The disadvantage of what I've proposed above is that you have to scan the whole filesystem once (very slow) before you start doing any work - and that's probably the point where you find there are bugs in the rest of your script, then you have to start again. So it may be quicker to debug if you write the program to read the CSV first, and then start doing the renames as you walk across the filesystem: idmap = {} csvfile.each do |old_id, new_id| idmap[old_id] = new_id end Find.find("/etc") do |path| old_id = basename[path] new_id = idmap[old_id] next unless new_id File.rename(path, File.join(File.dirname(path), new_id)) end That's completely untested, but is just to give you an idea. HTH, Brian. -- Posted via http://www.ruby-forum.com/.