Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 497
George Horlacher Avatar asked Oct 15 '13 21:10

George Horlacher


Video Answer


2 Answers

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
like image 66
midu Avatar answered Sep 30 '22 20:09

midu


Please use the FileUtils.copy_entry utility. Provide the entire path for both source & destination. It will copy recursively from source to destination excluding the source parent directory. This method preserves file types, c.f. symlink, directory… (FIFO, device files and etc. are not supported yet)

Example usage:

src = "/path/to/source/dir"
dest = "/path/to/destination/dir"
preserve = false
dereference_root = false
remove_destination = false

FileUtils.copy_entry(src, dest, preserve, dereference_root, remove_destination)

Both of src and dest must be a path name. src must exist, dest must not exist.

If preserve is true, this method preserves owner, group, permissions and modified time. Optional use.

If dereference_root is true, this method dereference tree root. Optional use.

If remove_destination is true, this method removes each destination file before copy. Optional use.

For more information, check out the documentation.

like image 28
padmaksha roy Avatar answered Sep 30 '22 20:09

padmaksha roy