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?

···

--
Posted via http://www.ruby-forum.com/.

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

···

On Wed, Apr 11, 2012 at 03:57:37AM +0900, Charlie B. wrote:

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?

--
Posted via http://www.ruby-forum.com/\.

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 than a 20 year old DOS command,
that's ridiculous.

···

--
Posted via http://www.ruby-forum.com/.

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

···

--
Posted via http://www.ruby-forum.com/.

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: Module: FileUtils (Ruby 1.9.3)

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.

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.

···

--
Posted via http://www.ruby-forum.com/.

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

···

--
Posted via http://www.ruby-forum.com/.

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

···

--
Posted via http://www.ruby-forum.com/.

why not use system("shell cmd")?

···

On Tue, Apr 10, 2012 at 3:19 PM, Charlie B. <lists@ruby-forum.com> wrote:

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 than a 20 year old DOS command,
that's ridiculous.

--
Posted via http://www.ruby-forum.com/\.

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

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

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")

···

--
Posted via http://www.ruby-forum.com/\.

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

···

On Tue, Apr 10, 2012 at 9:42 PM, Charlie B. <lists@ruby-forum.com> wrote:

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

--
[guy, jim].each {|him| remember.him do |as, often| as.you_can - without end}
http://blog.rubybestpractices.com/