递归副本,不包括匹配过滤器的文件夹

Jef*_*001 9 ruby rake

我正在尝试创建一个Rake方法将所有文件从一个位置复制到另一个位置但排除所有SVN文件夹的文件夹,包括其文件.

这是我开始使用的名为Filesystem的模块中的方法,但无法确定它是否可行或缺少的代码是什么.该模块具有以下要求:

require "fileutils"
Run Code Online (Sandbox Code Playgroud)

方法:

def FileSystem.CopyFilesWithoutSVN(source, target)
  # will copy files from source folder to target folder excluding .svn folders
  FileUtils.cp_r  Dir.glob( source ).reject{|entry| entry =~ missingCode }, target
end
Run Code Online (Sandbox Code Playgroud)

所以例如来源将是:

folderA
  folderB
    file1.cs
    file2.cs
    file3.cs
    file4.cs
    .svn
        fileA.base
        fileB.base
.svn
  fileC.base
  fileD.base
folderC 
    file5.cs
Run Code Online (Sandbox Code Playgroud)

那么目标在复制后将包含以下内容:

folderA
  folderB
    file1.cs
    file2.cs
    file3.cs
    file4.cs
folderC
    file5.cs  
Run Code Online (Sandbox Code Playgroud)

Lar*_*eth 9

对于此类事情,最简单的解决方案是使用rsync,前提是您的软件在安装它的系统上运行.

`rsync -a --exclude=.svn #{source}/ #{target}`
Run Code Online (Sandbox Code Playgroud)

您可能还希望添加--delete选项以删除目标树中不再存在于源树中的现有文件.

作为奖励,它只会在您下次运行时复制新文件或修改过的文件.您还可以使用它通过网络跨系统复制文件.有关更多信息,请参阅文档


如果您没有可用的rsync,或者不希望使代码依赖于它,则可以使用以下方法:

require 'find'
require 'fileutils'

def copy_without_svn(source_path, target_path)    
  Find.find(source_path) do |source|
    target = source.sub(/^#{source_path}/, target_path)
    if File.directory? source
      Find.prune if File.basename(source) == '.svn'
      FileUtils.mkdir target unless File.exists? target
    else
      FileUtils.copy source, target
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

Find是Ruby标准库的一部分.