2012-09-30 132 views
7

我的目标是将由模式指定的一组文件复制到目标目录。源目录中的文件可以有子目录。复制使用rake保存目录结构的文件

我想:

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

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

但既不工作。

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

但我需要复制唯一的* .html文件不是别的:

当我做类似的东西才有效。

我需要什么

cp --parents 

命令不

使用现有的Ruby /耙的方法有什么建议?

UPDATE看起来像Ant更容易做到的事情,用Ruby/Rake堆栈是不可能的 - 可能我需要看看别的东西。我不想编写自定义代码来使它在Ruby中工作。我只是想过Ruby/Rake作为适当的解决方案。

更新2这是我如何使用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

你可以复制的一切,然后删除未.HTML的人。这将会更容易,因为你不需要摆弄路径。 – d11wtq

+0

@ d11wtq,这不是一个好的解决方案,因为在这种情况下,您需要做两件额外的事情:复制不需要的文件,然后删除不需要的文件。 – Vladimir

回答

5

如果你想纯Ruby,你可以做到这一点(与fileutils中的标准库的帮助不大)。

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

嗨@Mark,我想要纯粹的Ruby解决方案,是的。但我想要一个更清晰的声明式方法。我认为这样的自动化可以通过Ruby/Rake堆栈来实现,而无需编写自定义代码。我希望更多的声明类似于:cp_r(,target中的 Vladimir

0

我还没有听说过的cp --parents做到这一点,但如果你想要做什么再有就是只用它从你的Rakefile没有羞耻,像这样:

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

嗨@David,谢谢你的建议。我昨天也没有听说过它:-)我想要一个更清洁的解决方案,它不需要调用系统命令,但使用纯Ruby工作,我认为这可以在Ruby中解决 - 否则我可以编写bash脚本代替。 – Vladimir

0

这可能是有用的:

# 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 
相关问题