खोज का उपयोग करके एक उप-निर्देशिका को छोड़ दें


115

मेरे पास इस तरह की निर्देशिका संरचना है

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

लेकिन यह उम्मीद के मुताबिक काम नहीं कर रहा है।

रवि


3
यह अच्छी सलाह नहीं है, लेकिन यह आपको कई स्थितियों से जल्दी और गंदा कर देगा: पाइप grep -v somethingजो आप इसे नहीं चाहते हैं उसे बाहर करने के लिए
मिकेल

जवाबों:


206

यह काम:

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

स्पष्टीकरण:

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

एक त्रुटि "खोज: खराब विकल्प नहीं मिल रहा: पाथ-लिस्ट विधेय-सूची"
रवि

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

इसका काम, लेकिन, इसकी सूची उन dirs में फाइल नहीं है।
रवि

1
-pathपूरे तार से मेल खाता है, इसलिए यदि आप कर रहे हैं find ., तो आपके -pathतार होने की जरूरत है./path/to/directory/*
हीथ बॉर्डर

1
FYI करें -not -pathनिश्चित रूप से इस उदाहरण में काम करेंगे, लेकिन findअभी भी निर्देशिका संरचना में पुनरावृत्ति कर रहा है और उन सभी निर्देशिकाओं / फ़ाइलों पर पुनरावृति करने के लिए cpu चक्रों का उपयोग कर रहा है। findउन निर्देशिकाओं / फ़ाइलों (शायद वहाँ लाखों फाइलें हैं) पर पुनरावृत्ति को रोकने के लिए तो आपको उपयोग करने की आवश्यकता है -prune(हालांकि -pruneविकल्प का उपयोग करना मुश्किल है)।
ट्रेवर बॉयड स्मिथ

9

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

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

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

प्रारंभिक प्रश्न से लिंक करने के लिए, अंत में मेरे लिए इस तरह काम किया:

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

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

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

$ find -version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX

5

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


2
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"

7
कुछ स्पष्टीकरण इसे बेहतर उत्तर में बना सकते हैं।
क्राइस लुआंगो

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

1
नोट: यह चाल काम नहीं करती है अगर find ... -print0कोई बाद मेंxargs -0
phs

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.