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

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

···

On Jul 20, 10:50 pm, Paul Archer <p...@paularcher.org> wrote:
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

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

Tomorrow, pharrington wrote:

···

On Jul 20, 10:50 pm, Paul Archer <p...@paularcher.org> wrote:
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

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

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

2:30am, pharrington wrote:

···

On Jul 20, 10:50 pm, Paul Archer <p...@paularcher.org> wrote:
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

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