2010-12-22 3 views
20

मैं हेडर फ़ाइलों को पोस्ट-प्रोसेस करने के लिए निर्देशिका को ग्लोब करना चाहता हूं। फिर भी मैं परियोजना में कुछ निर्देशिकाओं को बाहर करना चाहता हूं। अभी डिफ़ॉल्ट तरीका है ...क्या रूबी में निर्देशिका को ग्लोब करने का कोई तरीका है लेकिन कुछ निर्देशिकाओं को बाहर कर दें?

Dir["**/*.h"].each { |header| 
    puts header 
} 

अक्षम लगता है मैन्युअल रूप से प्रत्येक हैडर प्रविष्टि की जांच करने के लिए अगर यह एक बहिष्कृत निर्देशिका में है।

उत्तर

21

ग्लोबिंग का उपयोग न करें, इसके बजाय Find का उपयोग करें। खोजें आपको निर्देशिकाओं और फ़ाइलों तक पहुंचने के लिए डिज़ाइन किया गया है, और आप प्रोग्रामेटिक रूप से निर्णय लेते हैं कि किसी निर्देशिका से जमानत कब और अगली पर जाएं। दस्तावेज़ पृष्ठ पर उदाहरण देखें।

यदि आप ग्लोबिंग का उपयोग करना जारी रखना चाहते हैं तो यह आपको एक प्रारंभिक स्थान देगा। आप reject एक साथ or'd में कई परीक्षण रख सकते हैं:

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

आप परीक्षण में या तो निश्चित तार या regex का उपयोग कर सकते हैं।

+0

युक्त नामित फ़ाइलें/dir एक सरणी का निर्माण। क्या यह एक ही वाइल्डकार्ड का समर्थन नहीं करता है .glob? करना चाहते हैं ... अस्वीकार {| एफ | एफ ['**/*। tmpl.html']}। प्रत्येक {... – SimplGy

+2

भी नहीं ... .reject { | f | File.fnmatch ('**। Tmpl.html', f) } .each {... :) – SimplGy

+1

समझ गया, पथ मिलान की मेरी समझ गलत थी। डबल स्टार का मतलब यह नहीं है कि यह किसी भी निर्देशिका में मेल खाएगा, आपको अभी भी एक संदर्भ निर्देशिका की आवश्यकता है। काम करता है: .reject { | एफ | File.fnmatch ('../../../ मुख्य/वेबएप/**। Tmpl.html', f) – SimplGy

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 है (जो लगभग हमेशा डिफ़ॉल्ट रूप से स्थापित किया गया है, और रूबी 1.9 में मानक पुस्तकालय में शामिल है):

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

FileList है कुशलतापूर्वक globs के साथ काम करने के लिए बहुत सारी कार्यक्षमता।

आप प्रलेखन यहाँ पा सकते हैं: http://rake.rubyforge.org/classes/Rake/FileList.html

42

मैं जानता हूँ कि यह 4 साल देर हो चुकी है, लेकिन किसी और कि इस सवाल का आप डिर से उसी तरह आप बैश वाइल्डकार्ड से बहिष्कृत कर देगा बाहर कर सकते हैं भर में चला सकता है के लिए:

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

जो "त्रुटियों" से शुरू होने वाले किसी भी फ़ोल्डर को बाहर कर देगा, तो आप / को भी छोड़ सकते हैं और यदि आप चाहें तो इसे वाइल्डकार्ड में भी बदल सकते हैं।

+2

बिल्कुल देर से नहीं, धन्यवाद! – shicholas

+1

यह स्वीकार्य उत्तर अब होना चाहिए – dft

+0

फाइलों के लिए भी वही है, जो भी आवश्यक है: 'Dir.glob "विचार/{[! आंशिक _]} *। पतला" समझाया गया है: आप अपने विचार डीआईआर और हर फ्यूल पढ़ रहे हैं 'partial_' के साथ शुरू होता है। शेष .slim फ़ाइलों को सूचीबद्ध किया जाएगा। – three

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

इस में कुछ अन्य उत्तर बस थोड़ा लिखा अलग ढंग से

बीमार एक सरणी एक चाहते प्रत्येक यात्रा या कुछ और करने के लिए पारित किया जा सकता है कि बनाने के लिए समान है।

release_safelist = Dir.glob ('*')। अस्वीकार {| फ़ाइल | (फ़ाइल == "सॉफ्टलिंक्स") || (फाइल == "सीआई") || (File.include? "स्नैपशॉट")}

इस मामले im में मैं समझ नहीं सही ढंग से .reject का उपयोग कैसे करें के बिना या तो ci, softlinks, या स्नैपशॉट

संबंधित मुद्दे

 संबंधित मुद्दे