Copy all files in a directory

Still new to Ruby and feel silly having to ask such a simple question,
but I can’t find any examples of this on the web.

I have files in Dir1. I want to copy all the files, and only the files,
to Dir2. I don’t always know the name of them or their extensions, I
just want them all copied.

Is there really nothing as simple as xcopy c:\dir1*.* c:\dir2 ?? I
can’t find a wildcard argument under FileUtils.cp. Am I missing the
painfully obvious solution here?

You may well get a simpler solution (and I’ll be interested to see it
myself),
but fwiw, here’s how I roll with this kind of problem:

Dir.chdir( dir1 ) do
    Dir.glob( "**/*" ).select { |f| File.file?( f ) }.each do |f|
        dest = "#{dir2}/#{f}"
        FileUtils.mkdir_p( File.dirname( dest ) )
        FileUtils.cp( f, dest )
    end
end

It’s worth having a strategy for handling failures (remove partially
copied dir2
in begin/rescue, or perhaps modify the block above to detect and remove
existing
dest files, etc)

jonathan

I was afraid I’d have to resort to a loop to grab each file and move it.
I’m just shocked there isn’t a one line solution to this. When your
scripting language is more difficult and cumbersome than a 20 year old
DOS command,
that’s ridiculous.

why not use system(“shell cmd”)?

Is there really nothing as simple as xcopy c:\dir1*.* c:\dir2 ?? I
can’t find a wildcard argument under FileUtils.cp. Am I missing the
painfully obvious solution here?

From the docs:

FileUtils.cp %w(cgi.rb complex.rb date.rb), ‘/usr/lib/ruby/1.6’

Hence, you can pass a list of things as the first argument, and it’ll
work.

FileUtils.cp Dir[“dir1/*”].collect{|f| File.expand_path(f)}, “dir2”

That’s the shortest way I can think of.

Actually, since Dir.glob taks a block, I like this better:

Dir.glob(“dir1/*”) {|f| FileUtils.cp File.expand_path(f), “dir2” }

FileUtils.cp works great if you know what you want to copy and if you
have relatively few items. If you have a folder with 50 files in it,
even if you knew their names it isn’t practical to use the %w to copy
them all.

Steve K. gets the gold star today. Using Dir.glob this can all be
done in one line of code. Thank you!

Long Path Tool deletes/unlocks, copies/renames path too long
files/folders.

I’m leaning toward calling xcopy but I thought there would be a ruby
equivalent to it.

On Tue, Apr 10, 2012 at 9:42 PM, Charlie B. [email protected]
wrote:

Steve K. gets the gold star today. Using Dir.glob this can all be
done in one line of code. Thank you!

That solution has two issues:

  1. It does not filter by type.
  2. It unnecessarily expands the path.

FileUtils.cp Dir[“dir1/*”].select {|f| test ?f, f}, “dir2”

Or, with Pathname

FileUtils.cp Pathname.glob(“dir1/*”).select(&:file?), “dir2”

Cheers

robert

Charlie B. wrote in post #1055889:

I’m leaning toward calling xcopy but I thought there would be a ruby
equivalent to it.

do it yourself :

class Array
def xcopy(dir2)
FileUtils.cp(self,dir2)
self.size
end
end

and then

Dir["*.rb"].xcopy(“d:/save”)