9

ある場所から別の場所にすべてのファイルをコピーするRakeメソッドを作成しようとしていますが、ファイルを含むSVNフォルダーであるすべてのフォルダーを除外しています。

これは私が始めたファイルシステムと呼ばれるモジュールのメソッドですが、それが機能するかどうか、または不足しているコードが何であるかを理解できません。モジュールには次の要件があります。

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を使用できない場合、またはコードを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

あなたが欲しいものは次のようなものです

.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ませんので、あまり良くありません。一度に1つのファイルを実行するのはそれほど難しくありません。

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 に答える