2009-04-02 27 views
5

Tôi muốn viết tập lệnh ruby ​​để sao chép đệ quy cấu trúc thư mục nhưng loại trừ một số loại tệp nhất định. Vì vậy, với cấu trúc thư mục sau:Cách sao chép cấu trúc thư mục bằng ruby, ngoại trừ một số đuôi tệp nhất định

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

Tôi muốn sao chép cấu trúc này, nhưng exlcude .txtcs tập tin. Vì vậy, kết quả cấu trúc thư mục sẽ trông như thế này:

folder1 
    folder2 
    file4.html 
    folder2 
    folder3 
    file4.dll 

Trả lời

1

Tôi không chắc chắn những gì điểm khởi đầu của bạn, hoặc những gì bạn có nghĩa là bằng cách thủ công đi bộ, nhưng giả sử bạn đang lặp lại trong một bộ sưu tập các tác phẩm, bạn có thể sử dụng phương thức từ chối để loại trừ các mục dựa trên việc đánh giá điều kiện boolean.

dụ:

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

Trong ví dụ này, Glob trả về một bộ sưu tập đếm được của tên tập tin (bao gồm cả thư mục). Bạn loại trừ các mục mà bạn không muốn trong bộ lọc từ chối. Sau đó, bạn sẽ triển khai một phương thức lấy tên tệp và đích để sao chép.

Bạn có thể sử dụng phương pháp mảng bao gồm? trong khối từ chối, dọc theo các dòng của ví dụ Tìm từ Geo.

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

Bạn có thể sử dụng mô-đun tìm. Dưới đây là đoạn mã:


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

Có thể sử dụng một số tập lệnh shell?

files = `find | grep -v "\.\(txt\|cs\)$"`.split 
Các vấn đề liên quan