2012-07-11 216 views
35

使用Ruby,如何将一个目录的内容复制到另一个目录?例如,给定(非空)目录A和B:将一个目录的内容复制到另一个目录

A/ 
    bar 
    foo 
B/ 
    jam 
    jim 

我想一切从A复制到B,从而导致:

A/ 
    bar 
    foo 
B/ 
    bar 
    foo 
    jam 
    jim 

我不能使用FileUtils.cp_r,因为它复制目录本身:

irb(main):001:0> require 'fileutils' 
#=> true 
irb(main):002:0> Dir['**/*'] 
#=> ["A", "A/bar", "A/foo", "B", "B/jam", "B/jim"] 
irb(main):003:0> FileUtils.cp_r('A','B') 
#=> nil 
irb(main):004:0> Dir['**/*'] 
#=> ["A", "A/bar", "A/foo", "B", "B/A", "B/A/bar", "B/A/foo", "B/jam", "B/jim"] 

有没有比以下更好(更短,更有效)的答案?

Dir['A/*'].each{ |f| FileUtils.cp(f,"B") } 

回答

38

使用FileUtil的cp_r方法,只需在源目录参数的末尾添加/.

来自以下Ruby文档的示例。假定当前的工作目录中有src & dest目录。

FileUtils.cp_r 'src/.', 'dest' 

http://www.ruby-doc.org/stdlib-1.9.3/libdoc/fileutils/rdoc/FileUtils.html#method-c-cp_r

+1

虽然通过CasualCoder和BTA的答案是优秀的,当你有一个文件列表复制到一个共同的目标,这是真正的最好的答案。 (最少键入,最少方法调用。)完全阅读文档的好工作。 – Phrogz 2014-09-26 01:59:55

28

尝试:

FileUtils.cp_r(Dir['A/*'],'B') 
15

当使用FileUtils.cp_r,要知道,第一个参数也可以是文件列表。尝试是这样的:

FileUtils.cp_r(Dir.glob('A/*'), 'B') 
相关问题