如何递归复制目录内容并排除源目录本身?

时间:2013-10-15 21:09:48

标签: ruby copy fileutils

使用FileUtils cp_r通常是我复制目录的方式,但我似乎无法排除基目录。这就是我想要的工作,但事实并非如此:

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

source_path包含我想要递归复制的子目录。我只是不想要实际的source_path目录,只需要它下面的所有内容。

我尝试使用Dir.glob,但无法正确使用。

这是一个Windows副本,我知道我可以使用xcopy但想知道如何在Ruby中使用它。

2 个答案:

答案 0 :(得分:7)

您想使用source_path/.代替source_path/**,如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

这就是cp_files.rb的样子:

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

答案 1 :(得分:2)

请使用FileUtils.copy_entry实用程序。为源和提供完整的路径。目的地。除源源父目录外,它将从源递归复制到目标。此方法保留文件类型,c.f。符号链接,目录...(不支持FIFO,设备文件等)

使用示例:

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)

src dest 都必须是路径名。 src必须存在,dest必须不存在。

如果保留为真,此方法会保留所有者,组,权限和修改时间。可选用途。

如果 dereference_root为true ,则此方法取消引用树根。可选用途。

如果 remove_destination为true ,此方法会在复制前删除每个目标文件。可选用途。

有关详细信息,请check out the documentation