9

我正在尝试创建一种 Rake 方法来将所有文件从一个位置复制到另一个位置,但排除所有属于 SVN 文件夹的文件夹,包括它们的文件。

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

require "fileutils"

方法:

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

因此,例如,来源将是:

folderA
  folderB
    file1.cs
    file2.cs
    file3.cs
    file4.cs
    .svn
        fileA.base
        fileB.base
.svn
  fileC.base
  fileD.base
folderC 
    file5.cs

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

folderA
  folderB
    file1.cs
    file2.cs
    file3.cs
    file4.cs
folderC
    file5.cs  
4

4 回答 4

9

这种事情最简单的解决方案是使用rsync,前提是您的软件在安装它的系统上运行。

`rsync -a --exclude=.svn #{source}/ #{target}`

您可能还想添加--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

Find是 Ruby 标准库的一部分。

于 2012-08-02T14:04:27.507 回答
2

what you want is something like

.reject {|f| /.svn/.match(f) != nil }
于 2012-08-02T15:21:54.083 回答
1

您只是在根目录中查找名称匹配项,您应该递归地查找每个目录。我会说更容易复制所有内容,然后通过在新创建的目录中运行类似的内容来删除 SVN 文件:

`find #{target} -name ".svn" -type d -exec rm -rf {} \;`

所以你的方法看起来像这样:

module FileSystem
  def self.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
    `find #{target} -name ".svn" -type d -exec rm -rf {} \;`
  end
end
于 2012-08-02T11:27:21.607 回答
1

find并且rsync不是很好,因为很多系统都没有这些。一次做一个文件并不难:

FileUtils.mkdir_p(target) unless File.exists? target
Dir.glob("#{source}/**/*").reject{|f| f['.svn']}.each do |oldfile|
  newfile = target + oldfile.sub(source, '')
  File.file?(oldfile) ? FileUtils.copy(oldfile, newfile) : FileUtils.mkdir(newfile)
end
于 2012-08-03T01:03:05.567 回答