From: Jeremy Bopp Date: 2011-04-07T04:26:14+09:00 Subject: Re: Pathname: moving files & directories On 4/6/2011 13:18, Simon Harrison wrote: > This came up at work a while ago and our IT dept. said it was > impossible. If we have the following paths: > > dir/customer1/file1 > dir/customer1/file2 > dir/customer1/lots more files > dir/customer2/file1 > dir/customer2/file2 > dir/customer2/file3 > dir/customer2/obsolete/file1 > dir/customer2/oblolete/file2 > dir/customer3/file1 > dir/customer3/file2 > dir/customer3/obsolete/file1 > > ..etc > > how can we end up with this: > > /newdir/obsolete/customer2/file1 > /newdir/obsolete/customer2/file2 > /newdir/obsolete/customer3/file1 > > ..etc > > I can't really experiment at work because the IT folk would probably not > be best pleased if I delete everything. I'm not sure what to use. I can > get the paths easily with Dir.glob and then grep for 'obsolete'. But, > I've no idea how to rename the paths. Any help appreciated. First, a couple of recommendations given your concerns: 1. Make a copy of a representative sample of the data with which you'll experiment during development. 2. Design your solution to only copy the data to the new location while leaving the original data in place. This way you avoid the risk of trashing critical data while developing and running your solution. Removal of the data from the old location can be handled later, once the copy operation has been verified. You're on the right track with using Dir.glob to find your working set of paths. Next, would be to use something like a regexp to chop up your paths into something that you can reorder as you please. Here is something to get you going: require 'fileutils' src_paths = Dir.glob('dir/*/obsolete') dst_paths = src_paths.map do |path| path.sub(%r[^dir/(.*?)/obsolete], '/newdir/obsolete/\\1') end src_paths.zip(dst_paths).each do |src, dst| puts "Copying #{src} -> #{dst}" # Uncomment this when you want to try the copy operation. #FileUtils.cp_r(src, dst) end The above is untested and probably doesn't consider all the corner cases well enough, but it should be a reasonable starting point. -Jeremy