2012-07-11 11 views
35

Utilizzando Ruby, come posso copiare il contenuto di una directory in un'altra? Ad esempio, dato (non-vuoto) directory A e B:Copia il contenuto di una directory in un'altra

A/ 
    bar 
    foo 
B/ 
    jam 
    jim 

voglio copiare tutto dalla A in B, con conseguente:

A/ 
    bar 
    foo 
B/ 
    bar 
    foo 
    jam 
    jim 

non posso usare FileUtils.cp_r perché copia della directory stesso:

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"] 

C'è una risposta migliore (più breve, più efficiente) rispetto al seguente?

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

risposta

38

Usando il metodo di FileUtil cp_r, è sufficiente aggiungere /. alla fine del parametro directory di origine.

Esempio da Ruby doc sotto. Presuppone una directory di lavoro corrente con src & directory 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

Mentre le risposte da parte CasualCoder e BTA sono eccellenti per quando si dispone di un elenco di file da copiare verso una destinazione comune, questo è veramente la migliore risposta. (Meno battitura, meno chiamate al metodo.) Buon lavoro per la lettura completa della documentazione. – Phrogz

28

Prova:

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

Quando si utilizza FileUtils.cp_r, essere consapevoli che il primo argomento può essere anche un elenco di file. Provare qualcosa di simile:

FileUtils.cp_r(Dir.glob('A/*'), 'B') 
Problemi correlati