निर्देशिकाओं की सूची का मिलान निर्देशिका से एक स्तर गहरा खोजें


13

मैं उन निर्देशिकाओं की एक सूची प्राप्त करने की कोशिश कर रहा हूं जो एक विशिष्ट फ़ोल्डर में निहित हैं।

इन उदाहरण फ़ोल्डरों को देखते हुए:

foo/bar/test
foo/bar/test/css
foo/bar/wp-content/plugins/XYZ
foo/bar/wp-content/plugins/XYZ/js
foo/bar/wp-content/plugins/XYZ/css
baz/wp-content/plugins/ABC
baz/wp-content/plugins/ABC/inc
baz/wp-content/plugins/ABC/inc/lib
baz/wp-content/plugins/DEF
bat/bar/foo/blog/wp-content/plugins/GHI

मुझे एक आदेश चाहिए जो वापस आएगा:

XYZ
ABC
DEF
GHI

अनिवार्य रूप से, मैं उन फ़ोल्डरों की तलाश कर रहा हूं जो wp-content / plugins / के अंदर हैं

उपयोग करने findसे मुझे निकटतम मिल गया है, लेकिन मैं उपयोग नहीं कर सकता -maxdepth, क्योंकि फ़ोल्डर वह जगह है जहाँ मैं खोज रहा हूँ।

निम्नलिखित सभी बच्चे निर्देशिकाओं की पुनरावृत्ति करते हुए, फिर से चल रहे हैं।

find -type d -path *wp-content/plugins/*

foo/bar/wp-content/plugins/XYZ
foo/bar/wp-content/plugins/XYZ/js
foo/bar/wp-content/plugins/XYZ/css
baz/wp-content/plugins/ABC
baz/wp-content/plugins/ABC/inc
baz/wp-content/plugins/ABC/inc/lib
baz/wp-content/plugins/DEF
bat/bar/foo/blog/wp-content/plugins/GHI

जवाबों:


14

बस -pruneइतना जोड़ें कि मिली हुई निर्देशिका को नीचे नहीं उतारा जाए:

find . -type d -path '*/wp-content/plugins/*' -prune -print

आपको *wp-content/plugins/*यह उद्धृत करने की आवश्यकता है क्योंकि यह एक शेल ग्लोब भी है।

के रूप में, उनके पूरा पथ के लिए विरोध जीएनयू साथ आप केवल निर्देशिका नाम चाहते हैं find, तो आप बदल सकते हैं -printके साथ -printf '%f\n'या करने के लिए पाइप उपरोक्त आदेश के उत्पादन में यह सोचते हैं फ़ाइल पथ न्यू लाइन वर्ण नहीं है, awk -F / '{print $NF}'या sed 's|.*/||'(भी यह सोचते हैं फ़ाइल पथ शामिल केवल मान्य वर्ण)।

के साथ zsh:

printf '%s\n' **/wp-content/plugins/*(D/:t)

**/उपनिर्देशिका के किसी भी स्तर है (में सुविधा उद्भव zshजल्दी nighties में, और अब पसंद अधिकांश अन्य गोले में पाया ksh93, tcsh, fish, bash, yashहालांकि आम तौर पर कुछ विकल्प के अंतर्गत), (/)तरह का एकमात्र फ़ाइलों का चयन करने निर्देशिका , Dछिपा (डॉट) लोगों को शामिल करने के लिए, :tकरने के लिए पूंछ प्राप्त करें (फ़ाइल नाम)।


यह खोज, dirs में a में नई कथनों को परिवर्तित करेगी ?। बैश के लिए, (प्रश्न में टैग किए गए अनुसार) यह काम करता है
आइजैक

@sorontar, ऐसे findकार्यान्वयन जो ?किसी या किसी भी प्रतिस्थापन वर्ण या गैर-मुद्रण योग्य वर्णों के लिए भागने के किसी भी रूप को आउटपुट करते हैं, जब आउटपुट टर्मिनल पर जाता है, तब नहीं जब वह यहां जैसे पाइप पर जाता है।
स्टीफन चेज़लस

पहली (और केवल गैर zsh) कमांड जो आपके उत्तर में है, उसके पास कोई पाइप नहीं है, यह वह है जिसे मैंने परीक्षण किया है, और वह है जो नई सुर्खियों को बदलता है। जब पाइप किया जाता है, जैसा कि आपने कहा था: "फ़ाइल पथों को संभालने में न्यूलाइन वर्ण नहीं होते हैं", इसलिए, आपने पहले ही स्वीकार कर लिया है कि यह नई सूचियों के साथ भी विफल है।
इसहाक

@sorontar, माफ करना, मुझे लगा कि आप दूसरे हिस्से पर टिप्पणी कर रहे हैं कि यह ठीक है कि यह काम करेगा क्योंकि नई लाइनें बच जाएंगी, इसलिए हम उस धारणा को नहीं तोड़ेंगे जो हम कर रहे हैं sed/ awkकि सभी फाइलें एक पंक्ति में हैं। अब, यह तर्क हो सकता है कि एक हो रही ABC?BCDया ABC\nBCDइंटरैक्टिव / टर्मिनल उत्पादन के लिए दो हो रही तुलना में अधिक उपयोगी होगा ABCऔर BCDएक निर्देशिका कहा जाता है के लिए लाइनों $'ABC\nBCD। उपयोगकर्ता प्रस्तुति के स्तर पर, हम यह भी इंगित कर सकते हैं कि एक फ़ाइल के लिए $'AB\bC', जब आउटपुट टर्मिनल पर जाता है, तो आप ACइस तरह के ?प्रतिस्थापन के बिना देखेंगे ...
स्टीफन चेज़लस

प्रिंट के साथ खोजें और आउटपुट स्वरूप को संशोधित करने के लिए प्रिंटफ का उपयोग करके मुझे वही दिया गया जो मैं पूछ रहा था। बहुत बहुत धन्यवाद!
निक

4

बैश-ically:

shopt -s globstar
printf "%s\n" **/wp-content/plugins/*

प्रिंट:

bat/bar/foo/blog/wp-content/plugins/GHI
baz/wp-content/plugins/ABC
baz/wp-content/plugins/DEF
foo/bar/wp-content/plugins/XYZ

या

shopt -s globstar
for d in **/wp-content/plugins/*; do printf "%s\n" ${d##*/}; done

प्रिंट:

GHI
ABC
DEF
XYZ

नहींं, जो डायर के अंदर भी फाइल प्रिंट करेगा। कृपया मेरा उत्तर पढ़ें।
आइजैक

अच्छी बात; धन्यवाद! मैंने उनकी निर्देशिका संरचना को फिर से बनाया था, लेकिन उनमें परीक्षण फ़ाइलों को नहीं रखा था।
जेफ स्कालर

4

आप findपुनरावृत्ति कर सकते हैं , इसका प्रकार:

find / -type d -path *wp-content/plugins -exec find {} -maxdepth 1 -mindepth 1 -type d \;

3

बैश के लिए: सिंपल ( स्पेस और न्यूलाइन के साथ फाइल / डायर के लिए काम करता है ):

shopt -s globstar                    # allow ** for several dirs.
a=(**/wp-content/plugins/*/)         # capture only wanted dirs.
a=("${a[@]%/}")                      # remove trailing slash (dirs) `/`.
printf '%s\n' "${a[@]##*/}"          # print only the last dir name.

Wll प्रिंट:

GHI
ABC
DEF
XYZ

भले ही वहां फाइलें बनी हों।


ध्यान दें कि यह छिपी डायरियों के अंदर नहीं दिखता है, छिपी हुई फाइलों को छोड़ता है ( dotglobयदि वह अवांछित है तो विकल्प देखें ) और निर्देशिकाओं के अलावा निर्देशिकाओं के लिए सहानुभूति भी शामिल है ( **यह भी 4.2 और इससे पहले के बैश में सहानुभूति को पीछे छोड़ देगा)।
स्टीफन चेजलस

@ स्टीफनचेज़ेलैस छिपी हुई फाइलें? सवाल कोई नहीं पूछता है, केवल dirs। हां, छिपे हुए डायर को स्वतंत्र रूप से चुना जा सकता है (एक विशेषता के रूप में, यदि वांछित है)। और हां, बैश के वर्तमान संस्करण में सीमलिंक अनुप्रस्थ नहीं हैं।
इसहाक

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

3

treeआदेश इस उद्देश्य के लिए वास्तव में बनाया गया है। -Lझंडे के साथ गहराई को नियंत्रित किया जा सकता है । यहाँ एक स्थानीय वर्डप्रेस साइट पर एक उदाहरण है जिसे मैं बनाए रखता हूं:

$ tree -L 1 wp-content/
wp-content/
├── index.php
├── plugins
└── themes

2 directories, 1 file

$ tree -L 2 wp-content/
wp-content/
├── index.php
├── plugins
   ├── akismet
   ├── contact-form-7
   ├── index.php
   └── wordpress-seo
└── themes
    ├── index.php
    ├── twentyfifteen
    └── twentysixteen

11 directories, 3 files

$ tree -L 1 wp-content/plugins/
wp-content/plugins/
├── akismet
├── contact-form-7
├── index.php
└── wordpress-seo

5 directories, 1 file

1

डोपगोटी के उत्तर पर निर्माण, लूप ऑफ़ मैचिंग के बारे में:

find / -type d -iregex '.*/wp-content/plugins' -print0 | while read -r -d $'\0' D; do
    find "$D" -maxdepth 2 -mindepth 1
done

इस तरह से करने का कारण यह है कि आप इसे कई लोगों के साथ भ्रामक / बोझिल लग सकते हैं -exec, जबकि अभी भी अजीब फ़ाइल नाम वाले मुद्दों से परहेज कर रहे हैं, आदि -प्रण0 परिणाम के बीच अशक्त विभाजक का उपयोग करेगा।


0

आपने जो शुरू किया उस पर निर्माण:

find -type d -path *wp-content/plugins/* | egrep -o "wp-content/plugins/[^/]+($|/)" | sed -r "s~wp-content/plugins/([^/]+)($|/)~\1~" | uniq  

egrep grabs * wp-content / plugins / * और किसी भी वर्ण को अगले स्लैश / या पंक्ति $ के अंत तक - जिसमें आपका इच्छित भाग शामिल है।

sed , एक ~ सीमांकक के साथ, उस हिस्से का चयन करता है जिसे आप कोष्ठक के पहले सेट () का उपयोग करके चाहते हैं और सब कुछ के प्रतिस्थापन के रूप में \ 1 (जो आप चाहते हैं) का उपयोग करता है

uniq डुप्लिकेट परिणामों को फ़िल्टर करता है

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