2012-09-30 9 views
7

Mein Ziel ist es, eine Reihe von Dateien, die durch ein Muster angegeben sind, in das Zielverzeichnis zu kopieren. Die Dateien im Quellverzeichnis können Unterverzeichnisse enthalten.Kopieren von Dateien unter Beibehaltung der Verzeichnisstruktur mit Rake

Ich habe versucht:

cp_r(Dir.glob('**/*.html'), @target_dir): 

und

cp_r(FileList['**/*.html'], @target_dir): 

aber weder Arbeit.

es funktioniert nur, wenn ich so etwas wie:

cp_r(Dir['.'], @target_dir): 

Aber ich brauche nur * .html-Dateien nichts anderes zu kopieren.

Ich brauche was

cp --parents 

Befehl tut

Jede Beratung vorhandene Rubin/Rake Methoden verwenden?

UPDATE Sieht aus wie etwas, was mit Ant einfacher ist, ist nicht möglich mit Ruby/Rake-Stack - vielleicht müsste ich etwas anderes suchen. Ich möchte keinen benutzerdefinierten Code schreiben, damit er in Ruby funktioniert. Ich dachte gerade über Ruby/Rake als geeignete Lösung dafür nach.

UPDATE 2 Dies ist, wie ich es tun mit Ant

<target name="buildeweb" description="Builds web site" depends="clean"> 
    <mkdir dir="${build.dir.web}" /> 

    <copy todir="${build.dir.web}" verbose="true"> 
     <fileset dir="${source.dir.web}"> 
      <include name="**/*.html" /> 
      <include name="**/*.htm" /> 
     </fileset> 
    </copy> 

    <chmod perm="a+x"> 
     <fileset dir="${build.dir.web}"> 
      <include name="**/*.html" /> 
      <include name="**/*.htm" /> 
     </fileset> 
    </chmod> 
</target> 
+0

Sie alles kopieren könnte, dann diejenigen löschen, die nicht .html sind. Das wäre einfacher, da Sie nicht mit Pfaden herumspielen müssen. – d11wtq

+0

@ d11wtq, das ist keine gute Lösung, weil Sie in diesem Fall zwei zusätzliche Dinge tun müssen: Kopieren Sie nicht benötigte Dateien, und löschen Sie dann nicht benötigte Dateien. – Vladimir

Antwort

5

Wenn Sie reinen Rubin mögen, können Sie dies tun (mit einer wenig Hilfe von FileUtils in der Standardbibliothek).

require 'fileutils' 

Dir.glob('**/*.html').each do |file| 
    dir, filename = File.dirname(file), File.basename(file) 
    dest = File.join(@target_dir, dir) 
    FileUtils.mkdir_p(dest) 
    FileUtils.copy_file(file, File.join(dest,filename)) 
end 
+1

Hi @Mark, ich will reine Ruby-Lösung, ja. Aber ich hätte gerne einen saubereren deklarativen Ansatz. Ich dachte, dass eine solche Automatisierung mit Ruby/Rake-Stack möglich ist, ohne benutzerdefinierten Code zu schreiben. Ich hätte gerne etwas deklarativeres wie: cp_r (, target) ohne die Notwendigkeit irgendwelche seltsamen Methoden zu schreiben. Sieht aus wie es mit Std unmöglich ist. Ruby/Rake Stack - und ich muss vielleicht auf Bash oder Ant zurückgreifen. – Vladimir

0

Ich habe nicht von cp --parents gehört, aber wenn es das tut, was wollen Sie dann ist es keine Schande, nur um es von Ihrem Rakefile mit , wie folgt aus:

system("cp --parents #{your} #{args}") 
+0

Hallo @ David, danke für den Rat. Davon habe ich auch gestern noch nichts gehört :-) Ich hätte gerne eine sauberere Lösung, die nicht Systemkommandos aufrufen muss, sondern in reinem Ruby arbeitet, ich dachte, dass dies in Ruby gelöst werden könnte - sonst kann ich bash schreiben Skript stattdessen. – Vladimir

0

Dies könnte nützlich sein:

# copy "files" to "dest" with any sub-folders after "src_root". 
def copy_and_preserve files, dest, src_root 
    files.each {|f| 
    f.slice! src_root # the files without src_root dir 
    dest_dir = File.dirname(File.join(dest, f)) 
    FileUtils.mkdir_p dest_dir # make dest dir 
    FileUtils.cp(File.join(src_root, f), dest_dir, {:verbose => true}) 
    } 
end