Safe move/copy with incrementing filenames?

So, I’m working on some DAM (digital asset management) scripts, and I
want
to make sure that I don’t overwrite any files when I move or copy them.
I was about to start working on a move method that would add a number to
the destination filename if the name already exists. (IE
mv(‘pma_20090720_1234.jpg’, ‘archive/2009/07’) might create an
'archive/2009/07/pma_20090720_1234-1.jpg if pma_20090720_1234.jpg
exists.)

Question: is there already a module that can do that?

Paul

Paul
I’ve just been doing this:

def unique(filename)
count = 0
unique_name = filename
while File.exists?(unique_name)
count += 1
unique_name = “#{File.join(
File.dirname(filename),
File.basename(filename, “.*”))}_#{count}#{File.extname
(filename)}”
end
unique_name
end

there’s probably a better way though

Thanks. That’s a good start. While I think I’ll be working one file at a
time, FileUtils.mv can take a glob of filenames as the source, and a
directory as the destination–so I need to make sure I check every file
individually. If I end up with something that’s not too ugly, I’ll post
it.

Paul

Here’s what I came up with (incorporating your code, pharrington):

 def safe_move(source, dest, digits=2 )

     source.to_a.each do |src|

         if File.directory?(dest)
             d = File.join(dest, File.basename(src) )
         else
             d = dest
         end

         count = 0
         unique_name = d
         while File.exists?(unique_name)
             count += 1
             ext = File.extname(d)
             unique_name = File.join(
                     File.dirname(d),
                     File.basename(d, ext) +
                     sprintf("_%0#{digits}d", count) +
                     ext )
         end
         d = unique_name

     return FileUtils.mv(src, d)
     end

 end

Paul