Bash में ls का उपयोग करके केवल निर्देशिकाओं को सूचीबद्ध करना?


952

यह कमांड वर्तमान पथ में निर्देशिकाओं को सूचीबद्ध करता है: ls -d */

वास्तव में पैटर्न क्या करता */है?

और हम ls -d /home/alice/Documentsउस मार्ग में केवल निर्देशिकाओं को सूचीबद्ध करने के लिए उपरोक्त कमांड (जैसे ) में निरपेक्ष पथ कैसे दे सकते हैं ?


7
इस उत्तर को संपादित करें देखें unix.stackexchange.com/a/75047/32647 यह बताते हुए कि -dवास्तव में इसका क्या मतलब है।
एवगेनी सर्गेव

जवाबों:


989

*/एक ऐसा पैटर्न है जो वर्तमान निर्देशिका में *सभी उपनिर्देशिकाओं से मेल खाता है ( सभी फ़ाइलों और उपनिर्देशिकाओं से मेल खाएगा ; /इसे निर्देशिका में प्रतिबंधित करता है)। इसी तरह, सभी उपनिर्देशिकाओं को / home / alice / Documents के अंतर्गत सूचीबद्ध करने के लिए उपयोग करेंls -d /home/alice/Documents/*/


87
ध्यान दें कि */किसी भी छिपे हुए फ़ोल्डर से मेल नहीं खाएगा। उन्हें शामिल करने के लिए, या तो उन्हें स्पष्ट रूप से निर्दिष्ट करें ls -d .*/ */, या बैश में विकल्प सेट करेंdotglob
Gerg

1
@ytpillai ऐसा इसलिए हो रहा है क्योंकि सूची में कोई उपनिर्देशिकाएँ नहीं हैं। आप उस त्रुटि को कभी भी प्राप्त कर लेते हैं, जो आपके पास lsमौजूद नहीं है।
गॉर्डन डेविसन

1
ठीक है धन्यवाद, मैंने अभी-अभी उसके लिए जाँच की और यह पता चला कि एकमात्र निर्देशिका रूट फ़ोल्डर है।
ytpillai

1
@GordonDavisson विफलता के संदेश के साथ बैश विकल्प बचा जा सकता हैshopt -s nullglob

4
@BinaryZebra सेटिंग nullglob त्रुटि संदेश से बचती है, लेकिन इससे भी अधिक भ्रम होगा: nullglob सेट और कोई उपनिर्देशिका के साथ, ls */बस के लिए विस्तारित होगा ls, जो वर्तमान निर्देशिका में सभी फ़ाइलों को सूचीबद्ध करेगा। मुझे पूरा यकीन है कि आप उस मामले में नहीं चाहते हैं।
गॉर्डन डेविसन

481

इसे पूरा करने के चार तरीके, प्रत्येक एक अलग आउटपुट प्रारूप के साथ

1. उपयोग करना echo

उदाहरण: echo */, echo */*/
यहाँ मैं क्या मिला है:

cs/ draft/ files/ hacks/ masters/ static/  
cs/code/ files/images/ static/images/ static/stylesheets/  

2. lsकेवल का उपयोग करना

उदाहरण: ls -d */
यहाँ ठीक वही है जो मुझे मिला:

cs/     files/      masters/  
draft/  hacks/      static/  

या सूची के रूप में (विस्तार से जानकारी के साथ): ls -dl */

3. का उपयोग करना lsऔरgrep

उदाहरण: ls -l | grep "^d" यहाँ मुझे क्या मिला है:

drwxr-xr-x  24 h  staff     816 Jun  8 10:55 cs  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 draft  
drwxr-xr-x   9 h  staff     306 Jun  8 10:55 files  
drwxr-xr-x   2 h  staff      68 Jun  9 13:19 hacks  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 masters  
drwxr-xr-x   4 h  staff     136 Jun  8 10:55 static  

4. बैश स्क्रिप्ट (रिक्त स्थान के लिए फ़ाइल नाम के लिए अनुशंसित नहीं)

उदाहरण: for i in $(ls -d */); do echo ${i%%/}; done
यहाँ मुझे क्या मिला है:

cs  
draft  
files  
hacks  
masters  
static

यदि आपको अंत वर्ण के रूप में '/' पसंद है, तो कमांड होगी: for i in $(ls -d */); do echo ${i}; done

cs/  
draft/  
files/  
hacks/  
masters/  
static/

2
एनबी। 3मेरे लिए दूसरों की तुलना में काफ़ी धीमा था। निर्देशिका में मैंने परीक्षण किया: 1.012, 2.016, 3 .055 , 4.021।
isomorphismes

@isomorphismes, आपने समय को कैसे मापा? किस तरीक़े से? वैसे, मुझे कहना होगा, नहीं 1, मेरा पसंदीदा है।
अल्बर्ट

अल्बर्ट, मैंने इस्तेमाल किया time, यूनिक्स फ़ंक्शन। /// मैं सहमत हूँ, echo */की तुलना में चतुर है ls -d */
isomorphismes

9
दो छोटी-छोटी बातें जो आपको नोट करनी चाहिए। ls -l | grep "^ d" निर्देशिकाओं के प्रतीकात्मक लिंक को फ़िल्टर करता है, जबकि 'ls -d * /' उन्हें प्रदर्शित करता है। इसके अलावा, अगर लक्ष्य निर्देशिका में कोई निर्देशिका मौजूद नहीं है तो 'ls -d * /' विफल रहता है।
ज़ोरान पावलोविच

15
1.विकल्प प्रमुख दर्द का कारण होगा जब फ़ोल्डरों ऐसे नाम हैं जो रिक्त स्थान है गिर्द घूमती है।
श्रीकांत शरत '

99

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

ls -d */ | cut -f1 -d'/'

यह एक एकल स्तंभ बनाता है जिसमें कोई अनुगामी स्लैश नहीं है - लिपियों में उपयोगी।

मेरे दो सेंट।


18
-1के लिए विकल्प lsएकल-स्तंभ प्रारूप में इच्छा उत्पादन में, साथ ही ls -1 -d */
कालिन

3
@ user29020 को ध्यान देना चाहिए कि -1अभी भी हर प्रविष्टि के लिए एक अनुगामी स्लैश आउटपुट है।
डेनिस

जब मैं इसे .bashrcउपनाम के रूप में जोड़ता हूं, तो मैं कैसे जोड़ूं '/'?
आरएनए

@ उत्तर देने के लिए देर से, लेकिन भविष्य के लोगों के लिए: बैकस्लैश के साथ भागने की कोशिश करें? '\/'
काक

1
तोड़ता है अगर एक प्रमुख स्लैश है। यह केवल ट्रेलिंग स्लैश को हटाता है:| sed -e 's-/$--'
विक्टर सर्जेनको

62

सबफ़ोल्डर के बिना सभी फ़ोल्डरों के लिए :

find /home/alice/Documents -maxdepth 1 -type d

सभी फ़ोल्डर के लिए के साथ उप-फ़ोल्डर:

find /home/alice/Documents -type d

2
प्रश्न का मिलान करने के लिए (लेकिन डॉटफ़ाइल्स को शामिल करें), पहला होना चाहिए: find /home/alice/Documents -maxdepth 1 -mindepth 1 -type dअन्यथा आप /home/alice/Documentsखुद को शामिल करते हैं । साथ निर्देशिका के लिए सिमलिंक, उपसर्ग शामिल करने के लिए-L
jhnc

यह सबसे पवित्र समाधान की तरह लगता है, क्योंकि यह एक ऐसा उपकरण है जो वास्तव में इस कार्य के लिए बनाया गया है। आप पहले परिणाम को बाहर कर सकते हैं - /। वर्तमान निर्देशिका के लिए - grep -v '^
_///

38

4 (अधिक) विश्वसनीय विकल्प।

एक निर्विवाद तारांकन *शैल द्वारा एक पैटर्न (ग्लोब) के रूप में व्याख्या की जाएगी।
शेल इसका उपयोग पथनाम विस्तार में करेगा।
यह तब पैटर्न से मेल खाने वाले फ़ाइलनामों की एक सूची तैयार करेगा।
एक साधारण तारांकन PWD (वर्तमान वर्किंग डायरेक्टरी) में सभी फाइलनाम से मेल खाएगा।
एक अधिक जटिल पैटर्न के रूप में */सभी फाइलनाम से मेल खाता है जो अंत में होता है /
इस प्रकार, सभी निर्देशिका। यही कारण है कि आदेश:

1.- गूंज।

echo */
echo ./*/              ### avoid misinterpreting filenames like "-e dir"

echoPWD में सभी निर्देशिकाओं के लिए (शेल द्वारा) विस्तारित किया जाएगा ।


इसका परीक्षण करने के लिए: एक निर्देशिका बनाएं ( mkdir) जिसका नाम टेस्ट-डीआईआर जैसा है, और cdइसमें:

mkdir test-dir; cd test-dir

कुछ निर्देशिकाएँ बनाएँ:

mkdir {cs,files,masters,draft,static}   # safe directories.
mkdir {*,-,--,-v\ var,-h,-n,dir\ with\ spaces}  # some a bit less secure.
touch -- 'file with spaces' '-a' '-l' 'filename'    # and some files:

echo ./*/अजीब नाम वाली फ़ाइलों के साथ भी कमांड विश्वसनीय रहेगी:

./--/ ./-/ ./*/ ./cs/ ./dir with spaces/ ./draft/ ./files/ ./-h/
./masters/ ./-n/ ./static/ ./-v var/

लेकिन फ़ाइल नाम में रिक्त स्थान पढ़ने को थोड़ा भ्रमित करते हैं।


यदि इसके बजाय echo, हम उपयोग करते हैं ls, तो शेल अभी भी वही है जो फ़ाइल नाम की सूची का विस्तार कर रहा है। शेल PWD में निर्देशिकाओं की सूची प्राप्त करने का कारण है। इसे बनाने का -dविकल्प lsप्रत्येक निर्देशिका की सामग्री के बजाय वर्तमान निर्देशिका प्रविष्टि को सूचीबद्ध करता है (जैसा कि डिफ़ॉल्ट रूप से प्रस्तुत किया गया है)।

ls -d */

हालांकि, यह कमांड (कुछ हद तक) कम विश्वसनीय है। यह ऊपर सूचीबद्ध अजीब नाम वाली फ़ाइलों के साथ विफल हो जाएगा। यह कई नामों से घुट जाएगा। जब तक आप समस्या वाले लोगों को नहीं ढूंढ लेते तब तक आपको एक-एक करके मिटाने की जरूरत है।

2.- एल.एस.

जीएनयू ls"विकल्पों के अंत" ( --) कुंजी को स्वीकार करेगा ।

ls -d ./*/                     ### more reliable BSD ls
ls -d -- */                    ### more reliable GNU ls

3.-printf

प्रत्येक निर्देशिका को अपनी पंक्ति में (एक कॉलम में, ls -1 के समान) सूचीबद्ध करने के लिए, उपयोग करें:

$ printf "%s\n" */        ### Correct even with "-", spaces or newlines.

और, और भी बेहतर, हम अनुगामी को निकाल सकते हैं /:

$ set -- */; printf "%s\n" "${@%/}"        ### Correct with spaces and newlines.

इस तरह एक प्रयास:

$ for i in $(ls -d */); do echo ${i%%/}; done

पर विफल रहेगा:

  • ls -d */पहले से ऊपर दिखाए गए कुछ नाम ( )।
  • के मूल्य से प्रभावित होगा IFS
  • रिक्त स्थान और टैब पर नामों को विभाजित करेगा (डिफ़ॉल्ट के साथ IFS)।
  • नाम की प्रत्येक नई पंक्ति एक नई गूंज कमांड शुरू करेगी।

4.- समारोह

अंत में, किसी फ़ंक्शन के अंदर तर्क सूची का उपयोग करने से वर्तमान चल रहे शेल की तर्क सूची पर कोई प्रभाव नहीं पड़ेगा। सीधे शब्दों में:

$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs

इस सूची को प्रस्तुत करता है:

--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var

यह विकल्प कई प्रकार के विषम फ़ाइलनामों के साथ सुरक्षित हैं।


मुझे लगता है कि आपको सुरक्षित शब्द को विश्वसनीय के साथ बदलना चाहिए। आपका पोस्ट मुझे लगता है कि अन्य समाधान 'असुरक्षित' (असुरक्षित या शोषक) हैं
अमादो मार्टिनेज

1
@AmadoMartinez ने एक सामान्य एस / सुरक्षित / विश्वसनीय / किया। बेहतर?

21

treeआदेश यहाँ भी बहुत उपयोगी है। डिफ़ॉल्ट रूप से यह सभी फाइलों और निर्देशिकाओं को पूरी गहराई से दिखाएगा, जिसमें कुछ एससीआई पात्रों को निर्देशिका ट्री दिखाया जाएगा।

$ tree
.
├── config.dat
├── data
   ├── data1.bin
   ├── data2.inf
   └── sql
|      └── data3.sql
├── images
   ├── background.jpg
   ├── icon.gif
   └── logo.jpg
├── program.exe
└── readme.txt

लेकिन अगर हम केवल निर्देशिकाओं को प्राप्त करना चाहते हैं, बिना असीसी वृक्ष के, और वर्तमान निर्देशिका से पूर्ण पथ के साथ, आप कर सकते हैं:

$ tree -dfi
.
./data
./data/sql
./images

दलीलें दी जा रही हैं:

-d     List directories only.
-f     Prints the full path prefix for each file.
-i     Makes tree not print the indentation lines, useful when used in conjunction with the -f option.

और यदि आप तब पूर्ण मार्ग चाहते हैं, तो आप वर्तमान निर्देशिका के लिए पूर्ण पथ निर्दिष्ट करके शुरू कर सकते हैं:

$ tree -dfi "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/data/sql
/home/alice/Documents/images

और उप-सीमाओं की संख्या को सीमित करने के लिए, आप उप-सीमाओं के अधिकतम स्तर को -L level, जैसे:

$ tree -dfi -L 1 "$(pwd)"
/home/alice/Documents
/home/alice/Documents/data
/home/alice/Documents/images

मैन ट्री के साथ और भी तर्क देखे जा सकते हैं


15

यदि आप सोच रहे हैं कि 'ls -d * /' से आउटपुट आपको दो ट्रेलिंग स्लैश क्यों देता है , जैसे:

[prompt]$ ls -d */    
app//  cgi-bin//  lib//        pub//

यह शायद इसलिए है क्योंकि कहीं न कहीं आपका शेल या सेशन अलियास एलएस कमांड को एलएस के एक संस्करण के लिए फाइल करता है जिसमें -F फ्लैग शामिल है। यह ध्वज एक चरित्र को प्रत्येक आउटपुट नाम (जो एक सादा फ़ाइल नहीं है) को इंगित करता है कि यह किस तरह की चीज़ है। तो एक स्लैश पैटर्न '* /' के मिलान से है, और दूसरा स्लैश एप्लाइड टाइप इंडिकेटर है।

इस समस्या से छुटकारा पाने के लिए, आप निश्चित रूप से ls के लिए एक अलग उपनाम परिभाषित कर सकते हैं। हालाँकि, उर्फ ​​को अस्थायी रूप से आमंत्रित नहीं करने के लिए, आप बैकलैश के साथ कमांड को प्रीपेंड कर सकते हैं:

\ ls -d * /


11

मैं इसे केवल अपनी .bashrcफ़ाइल में जोड़ता हूं (आप इसे केवल कमांड लाइन पर टाइप कर सकते हैं यदि आपको केवल एक सत्र के लिए इसकी आवश्यकता है / चाहते हैं)

alias lsd='ls -ld */'

तब lsd वांछित परिणाम देगा।


क्या आप सिर्फ इस्तेमाल नहीं कर सकते? ls -l पथ | grep dr
jrobertsz66 15

5
"तो lsd वांछित परिणाम देगा।" मैं हँसता हूँ
fbafelipe

1
मेरे अनुभव में, यह एक परिणाम पैदा करता है।
टोड

मैं 'बालक' (सभी निर्देशिकाओं की सूची) का उपयोग करता हूं, और मैंने छिपी हुई निर्देशिकाओं को भी शामिल करने के लिए '*।' बेशक, निर्दोष मुझ पर नहीं खोया है।
ड्राईलैब्रेल

11

वास्तविक lsसमाधान, निर्देशिकाओं के प्रति सहानुभूति सहित

यहां कई उत्तर वास्तव में उपयोग नहीं करते हैं ls(या केवल ls -dवास्तविक उपनिर्देशन मिलान के लिए वाइल्डकार्ड का उपयोग करते समय, इसका उपयोग तुच्छ अर्थ में करते हैं। एक सच्चा lsसमाधान उपयोगी है, क्योंकि यह lsक्रमबद्ध करने के लिए विकल्पों के उपयोग की अनुमति देता है , आदि।

सिमिलिंक को छोड़कर

उपयोग करने lsका एक समाधान दिया गया है, लेकिन यह अन्य समाधानों से कुछ अलग करता है जिसमें यह निर्देशिकाओं के प्रति सहानुभूति को बाहर करता है :

ls -l | grep '^d'

(संभवतः पाइपिंग के माध्यम से sedया awkफ़ाइल नामों को अलग करने के लिए)

जिसमें सिमिलिंक भी शामिल है

निर्देशिकाओं के लिए सहानुभूति रखने वाले (शायद अधिक सामान्य) मामले में, हम -pविकल्प का उपयोग कर सकते हैं ls, जो इसे निर्देशिकाओं के नाम के लिए एक स्लैश वर्ण बनाता है (सिम्क्लिन वाले सहित):

ls -1p | grep '/$'

या, ट्रेलिंग स्लैश से छुटकारा पाना:

ls -1p | grep '/$' | sed 's/\/$//'

हम lsआवश्यकतानुसार विकल्प जोड़ सकते हैं (यदि लंबी सूची का उपयोग किया जाता है, तो -1अब आवश्यकता नहीं है)।

ध्यान दें: यदि हम स्लैशिंग ट्रेलिंग चाहते हैं , लेकिन उन्हें हाइलाइट नहीं करना चाहते हैं grep, तो हम लाइन के वास्तविक मिलान वाले हिस्से को खाली करके हाइलाइटिंग को हटा सकते हैं:

ls -1p | grep -P '(?=/$)'

9

यदि छिपी निर्देशिका को सूचीबद्ध करने की आवश्यकता नहीं है, तो मैं प्रस्तुत करता हूं:

ls -l | grep "^d" | awk -F" " '{print $9}'  

और यदि छिपी हुई निर्देशिकाओं को सूचीबद्ध करने की आवश्यकता है, तो उपयोग करें:

ls -Al | grep "^d" | awk -F" " '{print $9}'

या

find -maxdepth 1 -type d | awk -F"./" '{print $2}'

यदि आपको इसके बारे में अधिक जानकारी प्राप्त करने की आवश्यकता है awk, तो कृपया इस उत्तर को देखें
PHP Learner

अन्य उत्तरों की तुलना में "ls .. | grep ... | awk" का पहला विकल्प अत्यधिक स्क्रिप्टिंग लगता है।
लार्स नॉर्डिन

1
आप मान रहे हैं कि कोई निर्देशिका उनके नाम के अंदर व्हाट्सएप नहीं है।
बेंजामिन R

7

बिना फ़ोल्डर सूची दिखाने के लिए /

ls -d */|sed 's|[/]||g'

2
याls -d1 */ | tr -d "/"
ccpizza 15/15

बाहरी कमांड को कॉल करने की आवश्यकता नहीं है:set -- */; printf "%s\n" "${@%/}"

मुझे @wholanda का घोल पसंद है। मेरा एक छोटा सा समाधान है (परीक्षण और काम करता है): ls -d * / | sed 's | / || g'
klor

इसके अलावा lsdir उपनाम होना उपयोगी है: alias lsdirs = "ls -d * / /। Sed s s | / / g '"
klor

6

यहाँ मैं उपयोग कर रहा हूँ

ls -d1 /Directory/Path/*;


यह वास्तव में लाइन द्वारा इसे प्रदर्शित करने के लिए एक बहुत अच्छा समाधान है।
निकोले फ्रिक

यह केवल निर्देशिका को सूचीबद्ध नहीं करेगा। आपको एक अनुगामी स्लैश जोड़ना होगा:ls -d1 /Directory/Path/*/
स्किप्पी ले ग्रांड गौरौ

6

केवल निर्देशिकाओं की सूची के लिए :

ls -l | grep ^d

केवल फाइलों को सूचीबद्ध करने के लिए :

ls -l | grep -v ^d 

या आप भी कर सकते हैं: ls -ld * /


4

परीक्षण करें कि क्या आइटम एक निर्देशिका है test -d:

for i in $(ls); do test -d $i && echo $i ; done

1
कृपया बताएं कि यह कोड क्या करता है, और यह प्रश्न से कैसे संबंधित है।
केन वाईएन

1
यह तेह कमांड 'ls' चलाता है, तो आउटपुट टेस्ट-आईएनजी के माध्यम से लूप करता है यदि प्रत्येक एक डायरेक्टरी और इको-इन है, अगर यह है .. काम करता है, लेकिन बेहतर तरीके हैं
शू

3

*/ एक फ़ाइल नाम मिलान पैटर्न है जो वर्तमान निर्देशिका में निर्देशिकाओं से मेल खाता है।

केवल निर्देशिकाओं को सूचीबद्ध करने के लिए, मुझे यह फ़ंक्शन पसंद है:

# long list only directories
llod () { 
  ls -l --color=always "$@" | grep --color=never '^d'
}

इसे अपने .bashrc में रखें।

उपयोग के उदाहरण:

llod       # long listing of all directories in current directory
llod -tr   # same but in chronological order oldest first
llod -d a* # limit to directories beginning with letter 'a'
llod -d .* # limit to hidden directories

नोट: यदि आप -iविकल्प का उपयोग करते हैं तो यह टूट जाएगा । यहाँ इसके लिए एक फिक्स है:

# long list only directories
llod () { 
  ls -l --color=always "$@" | egrep --color=never '^d|^[[:digit:]]+ d'
}

3

FYI करें, यदि आप मल्टी-लाइन में सभी फाइलों को प्रिंट करना चाहते हैं, तो आप ऐसा कर सकते हैं ls -1जो प्रत्येक फाइल को एक अलग लाइन में प्रिंट करेगा। file1 file2 file3


3

वर्तमान निर्देशिका की एक सादी सूची, यह होगा:

ls -1d ./*/

क्या आप इसे क्रमबद्ध और साफ करना चाहते हैं?

ls -1d ./*/ | cut -c 3- | rev | cut -c 2- | rev | sort

याद रखें: पूंजीकृत वर्णों के प्रकार में भिन्न व्यवहार होता है


3

इसको आजमाओ। यह सभी linux distros के लिए काम करता है।

ls -ltr | grep drw

4
ls -l | grep '^d' | awk '{print $9}'
dw1

2

वन-लाइनर केवल "यहां" से निर्देशिकाओं को सूचीबद्ध करने के लिए।

फ़ाइल गिनती के साथ।

for i in `ls -d */`; do g=`find ./$i -type f -print| wc -l`; echo "Directory $i contains $g files."; done

2

मैंने आंशिक रूप से हल किया:

cd "/path/to/pricipal/folder"

for i in $(ls -d .*/); do sudo ln -s "$PWD"/${i%%/} /home/inukaze/${i%%/}; done

ln: «/home/inukaze/./.»: can't overwrite a directory
ln: «/home/inukaze/../..»: can't overwrite a directory
ln: accesing to «/home/inukaze/.config»: too much symbolics links levels
ln: accesing to «/home/inukaze/.disruptive»: too much symbolics links levels
ln: accesing to «/home/inukaze/innovations»: too much symbolics links levels
ln: accesing to «/home/inukaze/sarl»: too much symbolics links levels
ln: accesing to «/home/inukaze/.e_old»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gnome2_private»: too much symbolics links levels
ln: accesing to «/home/inukaze/.gvfs»: too much symbolics links levels
ln: accesing to «/home/inukaze/.kde»: too much symbolics links levels
ln: accesing to «/home/inukaze/.local»: too much symbolics links levels
ln: accesing to «/home/inukaze/.xVideoServiceThief»: too much symbolics links levels

खैर, यह मेरे लिए कम, मेयर भाग :)


2

इसे पूर्ण सर्कल में जोड़ने के लिए, प्रत्येक फ़ोल्डर के पथ को पुनः प्राप्त करने के लिए, अल्बर्ट के उत्तर के साथ-साथ गोर्डन्स के संयोजन का उपयोग करें जो कि बहुत उपयोगी होना चाहिए।

for i in $(ls -d /pathto/parent/folder/*/); do echo ${i%%/}; done

आउटपुट:

/pathto/parent/folder/childfolder1/
/pathto/parent/folder/childfolder2/
/pathto/parent/folder/childfolder3/
/pathto/parent/folder/childfolder4/
/pathto/parent/folder/childfolder5/
/pathto/parent/folder/childfolder6/
/pathto/parent/folder/childfolder7/
/pathto/parent/folder/childfolder8/


1

यहाँ मैं केवल निर्देशिका नामों को सूचीबद्ध करने के लिए उपयोग करता हूँ:

ls -1d /some/folder/*/ | awk -F "/" "{print \$(NF-1)}"

1

मूल प्रश्न का उत्तर देने के लिए, प्रति से */कुछ लेना देना नहीं lsहै; यह शेल / बैश द्वारा किया जाता है, एक प्रक्रिया में ग्लोबिंग के रूप में जाना जाता है

यही कारण है कि echo */और ls -d */समान तत्वों को आउटपुट करता है। ( -dध्वज lsनिर्देशिका नामों को आउटपुट करता है न कि निर्देशिकाओं की सामग्री को।)


1

यहां पेड़ का उपयोग करके एक भिन्नता है जो निर्देशिका नामों को केवल अलग लाइनों पर आउटपुट करता है, हाँ यह बदसूरत है लेकिन हे, यह काम करता है।

tree -d | grep -E '^[├|└]' | cut -d ' ' -f2

या जाग के साथ

tree -d | grep -E '^[├|└]' | awk '{print $2}'

यह शायद बेहतर है लेकिन /बाद में निर्देशिका नाम को बनाए रखेगा ।

ls -l | grep "^d" | awk '{print $9}'

यह कोरियाई जैसा दिखता है!
पाश्चलिस

0
file *|grep directory

ओ / पी (मेरी मशीन पर) -

[root@rhel6 ~]# file *|grep directory
mongo-example-master:    directory
nostarch:                directory
scriptzz:                directory
splunk:                  directory
testdir:                 directory

कट का उपयोग करके उपरोक्त आउटपुट को अधिक परिष्कृत किया जा सकता है।

file *|grep directory|cut -d':' -f1
mongo-example-master
nostarch
scriptzz
splunk
testdir

* could be replaced with any path that's permitted
 file - determine file type
 grep - searches for string named directory
 -d - to specify a field delimiter
 -f1 - denotes field 1

0

केवल निर्देशिकाओं की लिस्टिंग के लिए अब तक का सबसे छोटा कमांड (वास्तव में हैक)। ब्याज निर्देशिका की पूर्ण पथ या सापेक्ष पथ में टाइप करें और ब्याज की निर्देशिका में प्रवेश करने के लिए हिट दर्ज करें। अब टैब कीcd और टाइप करें । अब केवल निर्देशिका दिखाई जाती हैं।

user@ubuntu:~/Desktop$cd <tab key>

उपर्युक्त कमांड को अब डेस्कटॉप में केवल फ़ोल्डर प्रदर्शित करना चाहिए । सबसे छोटा वास्तव में।


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

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