खोज के साथ निर्देशिका नामों की सूची प्राप्त करें


35

मुझे पता है कि मैं निर्देशिका नामों की सूची प्राप्त करने के लिए ऐसा कर सकता हूं:

find . -type d -maxdepth 1 

आउटपुट इस तरह दिखता है:

.
./foo
./bar

मैं बिना लिस्टिंग पसंद करता हूं ./। वहाँ सिर्फ कच्चे नाम उत्पादन करने के लिए खोजने के लिए एक रास्ता है?

मैंने इसे प्रारूपित करने के लिए सूची को स्टेटस पर भेजने की कोशिश की, लेकिन यह मुझे वही परिणाम देता है:

find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'

तो आप सामने foo bar ...एक पंक्ति के बिना सभी चाहते हैं ./?
लेवोन

क्या यह पूरी तरह से कॉस्मेटिक / सौंदर्य कारणों से है या आप आउटपुट के साथ कुछ करने की कोशिश कर रहे हैं?
jw013

जवाबों:


42

GNU के साथ findआप -printfविकल्प का उपयोग कर सकते हैं :

find . -maxdepth 1 -type d -printf '%f\n'

जैसा कि टिप्पणियों में पावेल ने कहा है, यदि आप नहीं चाहते कि वर्तमान निर्देशिका को जोड़ा जाए -mindepth 1, जैसे:

find . -mindepth 1 -maxdepth 1 -type d -printf '%f\n'

मुझे नवीनतम POSIX कल्पना-printf में विकल्प का कोई उल्लेख नहीं मिल रहा है और मुझे आश्चर्य है कि यह कितना पोर्टेबल है ...
rahmu

@ प्रहमु: यह GNU खोज के साथ परीक्षण किया गया था। printfPOSIX द्वारा किसी भी विकल्प का उल्लेख नहीं किया गया है और वे कुछ अन्य findसंस्करणों द्वारा समर्थित नहीं लगते हैं । GNU खोज को अधिकांश स्थानों पर स्थापित किया जा सकता है, इसलिए इस अर्थ में यह पोर्टेबल है।
थोर

1
यह भी जोड़ें -mindepth 1कि क्या आप छुटकारा पाना चाहते हैं.
Paweł Pra Sepak

18

अद्यतन करें:

एक छोटा विकल्प:

 find . -maxdepth 1 -type d | cut -c 3-

आपको नाम देगा, एक प्रति पंक्ति, बिना किसी स्लैश के


4
@downvoter .. बिना किसी स्पष्टीकरण के किसी को भी मदद नहीं मिलती (ओपी, एसओ या मुझे)। यह ओपी के प्रश्न का एक कार्यात्मक समाधान है। यदि मुझे इंगित किया गया है या उत्तर में सुधार हुआ है, तो मुझे एक त्रुटि को सुधारने में खुशी होगी, लेकिन इसके लिए केवल "अनाम" क्लिक के बजाय रचनात्मक प्रतिक्रिया की आवश्यकता है ।
लेवोन

1
जब मैं आपके उत्तर को पार्स करना शामिल करता हूं तो मैं निराश हो जाता हूं ls। उसी समय मैंने एक लिंक पोस्ट किया था कि यह एक और उत्तर पर एक बुरा विचार क्यों है जो तब से हटा दिया गया है। उस समय केवल 2 उत्तर थे और कारण स्पष्ट लग रहा था। मुझे खुशी है कि आपने अस्पष्टता को इंगित किया, और यहाँ मेरा स्पष्टीकरण है। रिकॉर्ड के लिए, मैंने अपने उत्थान को एक उथल-पुथल में बदल दिया क्योंकि मैं आपके वर्तमान उत्तर से सहमत हूं।
रहमू

@ अन्य प्रश्न में आपके डाउनवोट के लिए स्पष्टीकरण देना मेरे लिए उपयोगी नहीं है (और केवल आपके लिए स्पष्ट है)। इसके अलावा, जबकि यह एक बेहतर समाधान है, जो समाधान मैंने पोस्ट किया था उससे पहले ठीक काम किया था (हाँ, मैं आपके "एलएस का उपयोग न करें" लिंक से परिचित हूं - लेकिन यह सभी मामलों में नेत्रहीन रूप से लागू नहीं होता है)। यदि आपके पास एक काउंटर उदाहरण है कि मेरे प्रारंभिक समाधान ने काम क्यों नहीं किया, तो मुझे यह जानकर अच्छा लगेगा (ताकि मैं वास्तव में इससे कुछ सीख सकूं), अन्यथा आप केवल एक लिंक पोस्ट कर रहे हैं और कुछ भी रचनात्मक नहीं दे रहे हैं।
लेवोन

विचार करें कि \nएक निर्देशिका नाम में आप इसे पुनः प्राप्त करने के लिए कट का उपयोग नहीं कर सकते हैं (जो कि आप तब कर रहे थे जब मैंने आपको नीचे उतारा था)। ऐसे कुछ मामले हैं जहां lsखतरनाक तरीके से व्यवहार नहीं किया जाता है और दूसरे तरीके का उपयोग करना लगभग हमेशा सुरक्षित होता है।
रहमू

9

GNU खोज का उपयोग करके, आप वर्तमान निर्देशिका के मिलान को खोजने से रोकने के लिए -mindepth का उपयोग कर सकते हैं:

find . -type d -maxdepth 1 -mindepth 1

चूँकि आप इसे पुनरावर्ती नहीं कर रहे हैं, आप बैश ग्लोब का उपयोग कर सकते हैं:

echo */

एक अनुगामी / एक ग्लोब में जोड़ने से केवल निर्देशिकाओं का मिलान होगा।


1
*/डॉट फ़ाइलों को याद करता है और इसमें सीमलिंक भी शामिल है। यह समस्या हो सकती है या नहीं भी।
गाइल्स का SO- बुराई से दूर रहना '

@ गिल्स - यह हमेशा सीलिंक को मिस करेगा, लेकिन डॉटफाइल्स इस बात पर निर्भर करता है कि डॉटग्लोब सेट है या नहीं।
jordanm

6

आज्ञा देना sedउन दो वर्णों को हटा दें:

find . -maxdepth 1 -type d | sed -e 's/^\.\///'

6

मैं उपयोग करना चाहता हूँ:

 find ./ -type d -maxdepth 1 -exec basename {} \;

2

मैं आमतौर पर उपयोग करता हूं:

find * -type d

लेकिन मुझे नहीं पता कि यह सही तरीका है कि आप क्या चाहते हैं।


1
यदि आप शेल को सभी फाइलनामों का विस्तार करने जा रहे हैं, तो सभी का उपयोग क्यों करें?
जोर्डन

@jordanm केवल निर्देशिका का चयन करने के लिए। echo */एक ही काम करना होगा, कम या ज्यादा (यह डॉट फ़ाइलों को याद करता है और सहानुभूति भी शामिल करता है), लेकिन तब जोचिम पूछेगा कि फाइनल कैसे निकालना है /
गिल्स एसओ- बुराई को रोकना '

0

AIX में पैरामीटर 'maxdepth' काम नहीं करता है।

सामान्य तौर पर यह मेरे लिए काम करता है:

find ./ -type d | cut -d"/" -f2 | sort -u


0

जिसे आप ढूंढ रहे हैं basenameउसे कहा जाता है , यह यूनिक्स निर्देशिका संरचना को अनदेखा करता है

नीचे उदाहरण:

find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;

यह cd कमांड चलाने से पहले आवश्यकता को हटाते हुए आउटपुट के लिए भी dir पाथ को बाहर कर देगा


कुछ विशेष जानकारी:

मैं आउटपुट के लिए एक और कमांड (पाइप) -execखोजने के लिए तर्क के रूप में पास करूँगा |(दूसरी कमांड को प्रत्येक आउटपुट लाइन पर जाने से बचाकर, यह कहते हुए कि आउटपुट के आधार पर यह स्क्रिप्ट के प्रदर्शन को बेहतर बना सकता है)

नोट: findविकल्प स्थितिगत नहीं हैं (-Maxdepth इसके पहले निर्दिष्ट परीक्षणों को प्रभावित करता है और साथ ही इसके बाद निर्दिष्ट किए गए)।

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