2012-07-11 265 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') 
相關問題