2017-01-16 73 views
4

我想檢查是否帶有通配符的模式,例如/var/data/**/*.xml與磁盤上的任何文件或目錄匹配。使用ruby檢查是否有任何文件或目錄匹配模式

顯然我可以使用Dir.glob但是當數以百萬計的文件太慢時,它會非常緩慢,因爲它太渴望了 - 它會返回所有匹配模式的文件,而我只需要知道是否有任何文件。

有什麼方法可以檢查嗎?

+0

http://stackoverflow.com/questions/3498539/search-a-folder-and-all-of-its-subfolders-for-files-of-certain-type – JLB

回答

3

Ruby的唯一

你可以使用Findfindfind:d。

我找不到任何其他返回Enumerator的File/Dir方法。

require 'find' 
Find.find("/var/data/").find{|f| f=~/\.xml$/i } 
#=> first xml file found inside "/var/data". nil otherwise 
# or 
Find.find("/var/data/").find{|f| File.extname(f).downcase == ".xml" } 

如果你真的只想要一個布爾值:

require 'find' 
Find.find("/var/data/").any?{|f| f=~/\.xml$/i } 

注意,如果"/var/data/"存在,但沒有.xml文件裏面,這種方法將至少夠慢的Dir.glob

至於我可以告訴大家:

Dir.glob("/var/data/**/*.xml"){|f| break f} 

返回它的第一個元素之前首先創建一個完整的陣列。

猛砸,僅

對於只bash的解決方案,你可以使用:

+0

恐怕'find'對我來說不是一個解決方案。 我必須檢查的路徑模式實際上是由用戶輸入的,後來傳遞給'find' shell命令。 我想要達到的最終效果是避免執行find時發現'沒有這樣的文件或目錄錯誤(從shell而不是ruby Find.find') – synek317

+1

明白了。 http://stackoverflow.com/questions/6363441/check-if-a-file-exists-with-wildcard-in-shell-script或http://unix.stackexchange.com/questions/79301/test-if-那裏有文件匹配模式按順序執行一個腳本可能會幫助您 –

+1

http://stackoverflow.com/questions/2937407/test-whether-a-glob-has-any -bash中的匹配它看起來像shell'find'可能是最好的選擇,其次是compgen。 –

相關問題