2009-04-02 14 views
5

Voglio scrivere uno script ruby ​​per copiare ricorsivamente una struttura di directory, ma escludere determinati tipi di file. Quindi, data la seguente struttura di directory:Come copiare una struttura di directory in ruby, escluse determinate estensioni di file

folder1 
    folder2 
    file1.txt 
    file2.txt 
    file3.cs 
    file4.html 
    folder2 
    folder3 
    file4.dll 

voglio copiare questa struttura, ma exlcude .txt e Cs file. Così, la struttura della directory risultante dovrebbe essere simile a questo:

folder1 
    folder2 
    file4.html 
    folder2 
    folder3 
    file4.dll 

risposta

1

Non sono sicuro di che cosa il vostro punto di partenza è, o cosa si intende per camminare manualmente, ma supponendo che si sta iterazione di una raccolta di file, è possibile utilizzare il metodo di rifiuto per escludere gli articoli in base alla valutazione di una condizione booleana.

esempio:

Dir.glob(File.join('.', '**', '*')).reject {|filename| File.extname(filename)== '.cs' }.each {|filename| do_copy_operation filename destination} 

In questo esempio, Glob restituisce una collezione numerabile di nomi di file (compreso quello delle directory). Si escludono gli elementi che non si desidera nel filtro di rifiuto. Quindi implementerai un metodo che accetta un nome file e una destinazione per eseguire la copia.

È possibile utilizzare il metodo array include? anche nel blocco di scarto, lungo le linee dell'esempio Trova da Geo.

Dir.glob(File.join('.', '**', '*')).reject {|file| ['.cs','.txt'].include?(File.extname(file)) } 
9

È possibile utilizzare il modulo di trovare. Ecco uno snippet di codice:


require "find" 

ignored_extensions = [".cs",".txt"] 

Find.find(path_to_directory) do |file| 
    # the name of the current file is in the variable file 
    # you have to test it to see if it's a dir or a file using File.directory? 
    # and you can get the extension using File.extname 

    # this skips over the .cs and .txt files 
    next if ignored_extensions.include?(File.extname(file)) 
    # insert logic to handle other type of files here 
    # if the file is a directory, you have to create on your destination dir 
    # and if it's a regular file, you just copy it. 
end 
0

Forse utilizzare alcuni script di shell?

files = `find | grep -v "\.\(txt\|cs\)$"`.split 
Problemi correlati