जवाबों:
आप उपयोग कर सकते हैं:
ls -d -- */
चूंकि सभी निर्देशिकाएं समाप्त होती हैं /
, यह केवल वर्तमान पथ में निर्देशिकाओं को सूचीबद्ध करता है। -D विकल्प सुनिश्चित करता है कि केवल निर्देशिका नाम मुद्रित कर रहे हैं, न उनकी सामग्री।
ls -d -- */
और के बीच क्या अंतर है ls -d */
?
--
पारंपरिक रूप से विकल्पों के अंत को चिह्नित करने के लिए उपयोग किया जाता है, ताकि यदि किसी फ़ाइल का नाम -l
ls हो , तो इसे लंबे लिस्टिंग प्रारूप विकल्प के रूप में व्याख्या नहीं करेगा।
स्टीफन मार्टिन की प्रतिक्रिया ने एक चेतावनी दी, और वर्तमान फ़ोल्डर को भी सूचीबद्ध किया, इसलिए मैं सुझाव दूंगा
find . -mindepth 1 -maxdepth 1 -type d
(यह लिनक्स पर है; मैं पाक्सिक्स मैन पेज में -मैक्सडेप और -मिंडेप को नहीं ढूंढ सका)
ls -d -- */
विकल्प पसंद है , जैसा find
कि छिपे हुए निर्देशकों को भी मिलेगा। जो कभी-कभी उपयोगी हो सकते हैं, लेकिन कभी-कभी परेशानी भी पैदा करते हैं। मुझे उम्मीद है कि यह टिप्पणी दूसरों की मदद कर सकती है। +1
डैनियल का जवाब सही है। यहाँ कुछ उपयोगी जोड़ हैं, हालांकि।
छिपे हुए फ़ोल्डर (जैसे .git
) को सूचीबद्ध करने से बचने के लिए , यह प्रयास करें:
find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \)
और कुछ वातावरणों में आउटपुट की शुरुआत में खूंखार डॉट स्लैश को बदलने के लिएfind
, इसका उपयोग करें:
find . -mindepth 1 -maxdepth 1 -type d \( ! -iname ".*" \) | sed 's|^\./||g'
आप "एलएस के उत्पादन को पार्स करने वाले नहीं हैं", या ऐसा कहा जाता है। इसके पीछे तर्क यह है कि उत्पादन मानव-पठनीय है और अगर मुझे याद है तो यह अनावश्यक रूप से पार्स करने के लिए जटिल बना सकता है।
यदि आप ls या नहीं चाहते हैं, तो आप "[-d]" के साथ "*" फ़िल्टर करने का प्रयास कर सकते हैं।
मैंने बस यही किया, किसी कारणवश ls और ढूँढें काम नहीं कर रहे थे (मेरे द्वारा अनुमान लगाए जाने वाले स्थान और कोष्ठक के साथ फ़ाइल नाम, या किसी और चीज़ की जिसे मैं देख रहा था), तो मैंने कुछ ऐसा किया था
for f in * ; do [ -d "$f" ] && echo $f is indeed a folder ; done
बस एक बात पर जोर देने के लिए जो मुझे यहाँ भ्रमित करता है, ग्लोब पैटर्न चयन के संबंध में; बोलो तुम्हारे पास यह है:
$ 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/
printf "%s\n" */
$ PWD में सभी निर्देशिकाओं को सूचीबद्ध करेगा।
echo */
भी काम करेगा, लेकिन एक लंबी एक-पंक्ति में, अधिक कठिन जब नामों में स्थान होते हैं।
आप भी उपयोग कर सकते हैं:
du
या:
git ls-tree -d -r --name-only @