2012-11-19 15 views
68

मैं इसको शामिल न करें किसी उप-निर्देशिका का उपयोग कर पाते हैं

data 
|___ 
    | 
    abc 
    |____incoming 
    def 
    |____incoming 
    |____processed 
    123 
    |___incoming 
    456 
    |___incoming 
    |___processed 

तरह निर्देशिका संरचना है वहाँ डाटा निर्देशिका के अंदर डर के सभी में एक इनकमिंग उप-फ़ोल्डर है। मैं डीफ़/इनकमिंग और 456/इनकमिंग डीआईआर को छोड़कर सभी फ़ोल्डरों और सब फ़ोल्डर्स से सभी फाइलें प्राप्त करना चाहता हूं। मैं आदेश

find /home/feeds/data -type d \(-name 'def/incoming' -o -name '456/incoming' -o -name arkona \) -prune -o -name '*.*' -print 

निम्नलिखित के साथ बाहर की कोशिश की, लेकिन यह काम नहीं कर रहा अपेक्षा के अनुरूप।

रवि

+1

यह अच्छी सलाह नहीं है, लेकिन यह आपको ऐसी स्थितियों का एक बहुत त्वरित और गंदी से बाहर निकलना होगा: पाइप कि करने के लिए 'ग्रेप -v something' बाहर करने के लिए जो कुछ भी यह आप डॉन 'है टी – Miquel

उत्तर

126

यह काम करता है:

find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*" 

स्पष्टीकरण:

  • find /home/feeds/data: निर्दिष्ट पथ से रिकर्सिवली खोजने
  • -type f शुरू: लगता है केवल
  • -not -path "*def/incoming*" फ़ाइलें: कुछ भी शामिल नहीं हैं i के हिस्से के रूप में def/incoming के साथ ts पथ
  • -not -path "*456/incoming*": अपने रास्ते के हिस्से के रूप 456/incoming के साथ कुछ भी शामिल नहीं हैं
+0

त्रुटि प्राप्त करना चाहते हैं "ढूंढें: खराब विकल्प-नहीं खोजें: पथ-सूची predicate-list" – Ravi

+0

@Ravi क्या आप बैश खोल का उपयोग कर रहे हैं? मैंने बस अपने टर्मिनल पर इसका परीक्षण किया और यह मेरे लिए काम करता है। यदि आपने अपनी स्क्रिप्ट में संशोधन किए हैं तो समाधान की प्रतिलिपि बनाने और चिपकाने का प्रयास करें। –

+0

यह काम कर रहा है, लेकिन, इसकी लिस्टिंग डीआईआर उन डीआईआर में फाइल नहीं है। – Ravi

4

-name केवल फ़ाइल नाम, न कि पूरी पथ से मेल खाता है। आप -path का उपयोग करना चाहते हैं, जिन हिस्सों में आप def/incoming जैसे निर्देशिकाओं को छीन रहे हैं।

4

बस प्रलेखन के लिए: आप बेहतर जानकारी के लिए के रूप में वहाँ कई search'n'skip नक्षत्र नहीं है हो सकता है (जैसे मुझे करना पड़ा)। यह हो सकता है कि prune आपका मित्र है जबकि -not -path आपकी अपेक्षा की अपेक्षा नहीं करेगा।

तो यह 15 खोज उदाहरण है कि निर्देशिकाओं को निकालने का एक महत्वपूर्ण उदाहरण है: तो फिर

find . -regex-type posix-extended -regex ".*def/incoming.*|.*456/incoming.*" -prune -o -print 

:

http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html

प्रारंभिक सवाल का लिंक करने के लिए, अंत में छोड़कर इस तरह मेरे लिए काम किया , अगर आप एक फ़ाइल ढूंढना चाहते हैं और अभी भी पेट्स को बाहर करना चाहते हैं, तो बस | grep myFile.txt जोड़ें।

यह आपके खोज संस्करण पर भी निर्भर हो सकता है। मैं देख रहा हूँ:

$ find -version 
GNU find version 4.2.27 
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX 
0
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/" 
+2

होना चाहिए कुछ स्पष्टीकरण इसे एक में बना सकते हैं बहुत बेहतर जवाब। –

+0

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