我想檢查是否帶有通配符的模式,例如/var/data/**/*.xml
與磁盤上的任何文件或目錄匹配。使用ruby檢查是否有任何文件或目錄匹配模式
顯然我可以使用Dir.glob
但是當數以百萬計的文件太慢時,它會非常緩慢,因爲它太渴望了 - 它會返回所有匹配模式的文件,而我只需要知道是否有任何文件。
有什麼方法可以檢查嗎?
我想檢查是否帶有通配符的模式,例如/var/data/**/*.xml
與磁盤上的任何文件或目錄匹配。使用ruby檢查是否有任何文件或目錄匹配模式
顯然我可以使用Dir.glob
但是當數以百萬計的文件太慢時,它會非常緩慢,因爲它太渴望了 - 它會返回所有匹配模式的文件,而我只需要知道是否有任何文件。
有什麼方法可以檢查嗎?
我找不到任何其他返回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的解決方案,你可以使用:
恐怕'find'對我來說不是一個解決方案。 我必須檢查的路徑模式實際上是由用戶輸入的,後來傳遞給'find' shell命令。 我想要達到的最終效果是避免執行find時發現'沒有這樣的文件或目錄錯誤(從shell而不是ruby Find.find') – synek317
明白了。 http://stackoverflow.com/questions/6363441/check-if-a-file-exists-with-wildcard-in-shell-script或http://unix.stackexchange.com/questions/79301/test-if-那裏有文件匹配模式按順序執行一個腳本可能會幫助您 –
http://stackoverflow.com/questions/2937407/test-whether-a-glob-has-any -bash中的匹配它看起來像shell'find'可能是最好的選擇,其次是compgen。 –
http://stackoverflow.com/questions/3498539/search-a-folder-and-all-of-its-subfolders-for-files-of-certain-type – JLB