एक ही नाम के साथ सभी निर्देशिकाओं के अंदर उपनिर्देशिका ढूँढना


8

मैं एक कमांड चलाना चाहता हूं:

  1. " inc" एक फ़ोल्डर के अंतर्गत " " " " नाम की सभी निर्देशिकाएं खोजें X
  2. प्रत्येक " X/.../inc/" के अंतर्गत सभी उपनिर्देशिकाओं को सूचीबद्ध करें ।
  3. " list" नामक फ़ाइल में आउटपुट को पुनर्निर्देशित करें

मैंने सफलता के बिना, नीचे दिए गए कमांड के विभिन्न संयोजनों की कोशिश की:

$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression

मैं यह कैसे कर सकता हूँ?

जवाबों:


13

find यह सब अपने आप कर सकते हैं:

find X -path '*/inc/*' -type d > list

अधिक जानकारी -pathके man findलिए हिस्सा पढ़ें ।

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



या X -name 'inc'
-type

@MaQleod: नहीं, यह सवाल नहीं है।
डैनियल एंडरसन

4

यहाँ एक आसान एक लाइनर है:

find X -type d -name "inc" -exec sh -c 'find {} -type d' \; > list

यह findपहले findपरिणामों में से प्रत्येक पर चलता है । execजैसा कि मैंने कहा - - विकल्प भी एक न्यूनतम शेल कमांड, जिसमें ले जा सकते हैं {}पहले से प्रत्येक निर्देशिका साथ बदल दिया है find

findआपके अनुरोध के अनुसार दूसरी वसीयत, incनिर्देशिका सहित पहले परिणामों के "सभी उपनिर्देशिकाओं की सूची" । यदि आप आउटपुट में खुद को नहीं चाहते हैं, तो गहराई 1 के दूसरे find कम से कम आउटपुट फ़ोल्डर को दें।

find X -type d -name "inc" -exec sh -c 'find {} -mindepth 1 -type d' \; > list

हम तो बस आदेश के रीडायरेक्ट करेंगे stdoutमें list


उस उत्तर पर एक भिन्नता मेरे लिए उपयोगी थी जहाँ मैं केवल मूल मैच की गहराई 1 उप निर्देशिका चाहता था find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
Core

1

ठीक है मुझे इस नेस्टेड खोज का अनुकरण करने का उत्तर मिला है:

find X/ -type d | grep "/inc/" > list

अच्छा, यह भी काम करेंगे! हालांकि, यूनिक्स / लिनक्स गोले में, वास्तव में उत्तर जैसी कोई चीज नहीं है । यह व्यक्तिगत प्राथमिकताओं का मिश्रण है और इसका पालन करना आसान है।
विशाल कोटरलकोटा

उदाहरण के लिए अपरंपरागत (लेकिन मौजूदा) फ़ाइल नामों की देखभाल करने के लिए उदाहरण के लिए newlines: find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list( grep -zयह भी अशक्त चरित्र पर परिसीमन करता है, लेकिन इसका आउटपुट अशक्त होने के साथ ही अलग-थलग प्रतीत होता है, इसलिए फिर इसे उदाहरण xargs -0L1 echoके लिए इसे लाइन पर लाने के लिए इसे पाइप करने की आवश्यकता होगी )। इस मामले में, चूंकि आप सूची को नई प्रविष्टि द्वारा अलग किए गए हर प्रविष्टि के साथ फ़ाइल करने के लिए सहेज रहे हैं, फ़ाइल नामों में नई सूची अभी भी अस्पष्ट रूप से दर्शाई जाएगी। शायद आपको सूची के साथ क्या करना है, इसके आधार पर आपको मध्यवर्ती फ़ाइल की आवश्यकता नहीं है।
डैनियल एंडरसन

1

इसे इस्तेमाल करे:

   find path-of-x -path '*/inc/*' -type d > list

मेरे पास अब इसका परीक्षण करने के लिए लाइनक्स मशीन नहीं है ...
प्रिंस जॉन वेस्ले

यह काम नहीं करता है। लेकिन मुझे सुझाव देने के लिए धन्यवाद "\inc\":)
iammilind

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