How can I recursively copy the directory contents and exclude the source directory itself?

George Horlacher picture George Horlacher · Oct 15, 2013 · Viewed 8k times · Source

Using FileUtils cp_r is usually how I copy directories, but I can't seem to exclude the base directory. This is what I wanted to work, but it doesn't:

FileUtils.cp_r "#{source_path}\\**", target_path, :verbose => true

source_path has sub-directories I want to copy recursively. I just don't want the actual source_path directory, just everything below it.

I tried using Dir.glob but could not get it right.

This is a Windows copy and I know I can use xcopy but want to know how to do it in Ruby.

Answer

midu picture midu · Oct 15, 2013

You want to use source_path/. instead of source_path/**, as describe in the last example of the documentation

➜  fileutils  ls
cp_files.rb dst         source
➜  fileutils  tree source 
source
├── a.txt
├── b.txt
├── c.txt
└── deep
    └── d.txt

1 directory, 4 files
➜  fileutils  tree dst 
dst

0 directories, 0 files
➜  fileutils  cat cp_files.rb 
require 'fileutils'
FileUtils.cp_r "source/.", 'dst', :verbose => true
➜  fileutils  ruby cp_files.rb 
cp -r source/. dst
➜  fileutils  tree dst
dst
├── a.txt
├── b.txt
├── c.txt
└── deep
    └── d.txt

1 directory, 4 files

This is what cp_files.rb looks like:

require 'fileutils'
FileUtils.cp_r "source/.", 'dst', :verbose => true