बैश कमांड का उपयोग करके फ़ोल्डर्स को कैसे सूचीबद्ध करें?


52

क्या बैश कमांड का उपयोग करके किसी निर्देशिका में सिर्फ फ़ोल्डर्स को सूचीबद्ध करने का कोई तरीका है? (जैसा कि lsकमांड सभी फाइलों और फ़ोल्डरों को सूचीबद्ध करता है)

जवाबों:


66

आप उपयोग कर सकते हैं:

ls -d -- */

चूंकि सभी निर्देशिकाएं समाप्त होती हैं /, यह केवल वर्तमान पथ में निर्देशिकाओं को सूचीबद्ध करता है। -D विकल्प सुनिश्चित करता है कि केवल निर्देशिका नाम मुद्रित कर रहे हैं, न उनकी सामग्री।


2
ls - * / नीचे उनकी सामग्री के साथ सभी निर्देशिकाओं को सूचीबद्ध करता है
Vins

1
@ 8088 ls -d -- */और के बीच क्या अंतर है ls -d */?
लुई

5
@Louis, --पारंपरिक रूप से विकल्पों के अंत को चिह्नित करने के लिए उपयोग किया जाता है, ताकि यदि किसी फ़ाइल का नाम -lls हो , तो इसे लंबे लिस्टिंग प्रारूप विकल्प के रूप में व्याख्या नहीं करेगा।
क्रिस्टियन सियुपिटु

28

स्टीफन मार्टिन की प्रतिक्रिया ने एक चेतावनी दी, और वर्तमान फ़ोल्डर को भी सूचीबद्ध किया, इसलिए मैं सुझाव दूंगा

find . -mindepth 1 -maxdepth 1 -type d

(यह लिनक्स पर है; मैं पाक्सिक्स मैन पेज में -मैक्सडेप और -मिंडेप को नहीं ढूंढ सका)


1
पुराना सवाल मुझे पता है। हालांकि मैं शुरू में इस कार्य को खोजने के लिए मुड़ूंगा, मुझे ls -d -- */विकल्प पसंद है , जैसा findकि छिपे हुए निर्देशकों को भी मिलेगा। जो कभी-कभी उपयोगी हो सकते हैं, लेकिन कभी-कभी परेशानी भी पैदा करते हैं। मुझे उम्मीद है कि यह टिप्पणी दूसरों की मदद कर सकती है। +1
Matchew

12
find . -maxdepth 1 -type d

सिर्फ फोल्डर की सूची देंगे। और जैसा कि टेडी ने बताया कि आपको जरूरत है -मैक्सडेप को रोकने की


5
आप -maxdepth 1भी शायद चाहते हैं।
टेडी

6

डैनियल का जवाब सही है। यहाँ कुछ उपयोगी जोड़ हैं, हालांकि।

छिपे हुए फ़ोल्डर (जैसे .git) को सूचीबद्ध करने से बचने के लिए , यह प्रयास करें:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \)

और कुछ वातावरणों में आउटपुट की शुरुआत में खूंखार डॉट स्लैश को बदलने के लिएfind , इसका उपयोग करें:

find . -mindepth 1 -maxdepth 1 -type d  \( ! -iname ".*" \) | sed 's|^\./||g'

1

आप "एलएस के उत्पादन को पार्स करने वाले नहीं हैं", या ऐसा कहा जाता है। इसके पीछे तर्क यह है कि उत्पादन मानव-पठनीय है और अगर मुझे याद है तो यह अनावश्यक रूप से पार्स करने के लिए जटिल बना सकता है।

यदि आप ls या नहीं चाहते हैं, तो आप "[-d]" के साथ "*" फ़िल्टर करने का प्रयास कर सकते हैं।

मैंने बस यही किया, किसी कारणवश ls और ढूँढें काम नहीं कर रहे थे (मेरे द्वारा अनुमान लगाए जाने वाले स्थान और कोष्ठक के साथ फ़ाइल नाम, या किसी और चीज़ की जिसे मैं देख रहा था), तो मैंने कुछ ऐसा किया था

for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done

0

बस एक बात पर जोर देने के लिए जो मुझे यहाँ भ्रमित करता है, ग्लोब पैटर्न चयन के संबंध में; बोलो तुम्हारे पास यह है:

$ cd /tmp
$ mkdir testglob
$ for ix in {00,01,02,03} ; do mkdir testglob/mydir_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/myfile_${ix} ; done
$ for ix in {00,01,02,03} ; do touch testglob/mydir_${ix}.txt ; done
$ for ix in {00,01,02,03} ; do mkdir testglob/otherdir_${ix} ; done
$ tree testglob/
testglob/
├── mydir_00
├── mydir_00.txt
├── mydir_01
├── mydir_01.txt
├── mydir_02
├── mydir_02.txt
├── mydir_03
├── mydir_03.txt
├── myfile_00
├── myfile_01
├── myfile_02
├── myfile_03
├── otherdir_00
├── otherdir_01
├── otherdir_02
└── otherdir_03

8 directories, 8 files

इसलिए, यहां पर कहें कि आप केवल mydir*निर्देशिकाओं का चयन करना चाहते हैं । ध्यान दें कि यदि आप समाप्ति स्लैश छोड़ते हैं, ls -dतो फाइलों को भी सूचीबद्ध करेगा:

$ ls -d testglob/mydir*   # also `ls -d -- testglob/mydir*`
testglob/mydir_00      testglob/mydir_01      testglob/mydir_02      testglob/mydir_03
testglob/mydir_00.txt  testglob/mydir_01.txt  testglob/mydir_02.txt  testglob/mydir_03.txt

... हालाँकि, एक समाप्ति स्लैश के साथ, तब केवल निर्देशिकाएं सूचीबद्ध हैं:

$ ls -d testglob/mydir*/   # also `ls -d -- testglob/mydir*/`
testglob/mydir_00/  testglob/mydir_01/  testglob/mydir_02/  testglob/mydir_03/

0

printf "%s\n" */ $ PWD में सभी निर्देशिकाओं को सूचीबद्ध करेगा।

echo */ भी काम करेगा, लेकिन एक लंबी एक-पंक्ति में, अधिक कठिन जब नामों में स्थान होते हैं।


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