2010-12-22 81 views

回答

21

請勿使用通配符,而應使用Find。查找旨在讓您訪問遇到的目錄和文件,並以編程方式決定何時退出目錄並轉到下一個目錄。請參閱文檔頁面上的示例。

如果你想繼續使用globbing這會給你一個開始的地方。你可以把多個測試中reject或運算在一起:

Dir['**/*.h'].reject{ |f| f['/path/to/skip'] || f[%r{^/another/path/to/skip}] }.each do |filename| 
    puts filename 
end 

您可以在測試中使用的是固定的字符串或正則表達式。

+0

文件/目錄的陣列我不能找出如何正確使用.reject。它不支持與.glob相同的通配符嗎?想要做...拒絕{| f | f ['**/*。tmpl.html']} .each {... – SimplGy 2012-11-01 22:25:22

+2

也沒有... .reject { | f | File.fnmatch('**。tmpl.html',f) } .each {... :) – SimplGy 2012-11-01 22:32:32

3

方式一:

require 'find' 

ignores = ['doc','test','specifications'] 

Find.find(ENV['HOME']) do |path| 
    name = File.basename(path) 
    if FileTest.directory?(path) 
    if ignores.include?(name) 
     Find.prune 
    else 
     next 
    end 
    else 
    puts path if name =~ /.h$/ 
    end 
end 
16

有來自耙創業板公司FileList(這幾乎總是默認安裝的,並且包含在標準庫中的Ruby 1.9):

files = FileList['**/*.h'].exclude('skip_me') 

FileList有大量的功能可以有效地處理球體。

您可以在這裏找到的文檔:http://rake.rubyforge.org/classes/Rake/FileList.html

42

我知道這4年遲,但對於其他人可能會碰到這個問題,你可以從迪爾排除,你會從猛砸通配符排除以同樣的方式運行:

Dir["lib/{[!errors/]**/*,*}.rb"] 

這將排除任何以「錯誤」開頭的文件夾,您甚至可以省略/並將其變爲各種通配符,如果需要的話。

3
files = Dir.glob(pattern) 
files -= Dir.glob("#{exclude}/**/*") 
0

這類似於剛剛寫有點不同

生病創建一個可以傳遞給。每次迭代或別的什麼數組一些其他的答案。

release_safelist = Dir.glob('*')。reject {| file | (文件==「softlinks」)|| (文件==「ci」)|| (file.include?「快照」)}

在這種情況下創建即時沒有命名或者Cl,軟鏈接,或含有快照

相關問題