2009-04-02 6 views
5

Ich möchte ein Ruby-Skript schreiben, um rekursiv eine Verzeichnisstruktur zu kopieren, aber bestimmte Dateitypen auszuschließen. Also, die folgende Verzeichnisstruktur gegeben:So kopieren Sie eine Verzeichnisstruktur in Ruby, ausgenommen bestimmte Dateierweiterungen

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

Ich mag diese Struktur kopieren, aber exlcude .txt und CS- Dateien. So wird die resultierende Verzeichnisstruktur soll wie folgt aussehen:

folder1 
    folder2 
    file4.html 
    folder2 
    folder3 
    file4.dll 

Antwort

1

Ich bin mir nicht sicher, was Ihr Ausgangspunkt ist, oder was meinen Sie manuell zu Fuß, aber vorausgesetzt, Sie über eine Sammlung von Dateien iterieren, Sie können die Zurückweisungsmethode verwenden, um Elemente basierend auf der Auswertung einer booleschen Bedingung auszuschließen.

Beispiel:

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

In diesem Beispiel gibt Glob eine zählbare Sammlung von Dateinamen (einschließlich Verzeichnisse). Sie schließen die Elemente aus, die Sie nicht im Ablehnungsfilter haben möchten. Sie implementieren dann eine Methode, die einen Dateinamen und ein Ziel für die Kopie verwendet.

Sie können die Array-Methode include verwenden? im Block "Zurückweisen" ebenfalls, wie im Beispiel von Geo.

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

könnten Sie verwenden das Modul finden. Hier ist ein Code-Schnipsel:


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

Vielleicht einige Shell-Skripte verwenden?

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