2009-04-02 8 views
5

Je veux écrire un script ruby ​​pour copier récursivement une structure de répertoires, mais exclure certains types de fichiers. Ainsi, compte tenu de la structure de répertoire suivant:Comment copier une structure de répertoires dans ruby, à l'exclusion de certaines extensions de fichier

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

Je veux copier cette structure, mais exlcude txt et .cs fichiers. Ainsi, la structure de répertoire résultant devrait ressembler à ceci:

folder1 
    folder2 
    file4.html 
    folder2 
    folder3 
    file4.dll 

Répondre

1

Je ne suis pas sûr de ce que votre point de départ est, ou ce que vous entendez par la marche manuellement, mais en supposant que vous itérer sur une collection de fichiers, vous pouvez utiliser la méthode reject pour exclure des éléments en fonction de l'évaluation d'une condition booléenne.

exemple:

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

Dans cet exemple, Glob retourne une collection dénombrable de noms de fichiers (y compris les répertoires). Vous excluez les éléments que vous ne voulez pas dans le filtre de rejet. Vous allez ensuite implémenter une méthode qui prend un nom de fichier et une destination pour faire la copie.

Vous pouvez utiliser la méthode de tableau include? dans le bloc Rejeter également, suivant les lignes de l'exemple Find de Geo.

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

Vous pouvez utiliser le module trouver. Voici un extrait de code:


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

Peut-être utiliser des scripts shell?

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