我正在尝试创建一个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
答案 0 :(得分: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标准库的一部分。
答案 1 :(得分:2)
你想要的是
.reject {|f| /.svn/.match(f) != nil }
答案 2 :(得分: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
答案 3 :(得分: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