जवाबों:
*/
एक ऐसा पैटर्न है जो वर्तमान निर्देशिका में *
सभी उपनिर्देशिकाओं से मेल खाता है ( सभी फ़ाइलों और उपनिर्देशिकाओं से मेल खाएगा ; /
इसे निर्देशिका में प्रतिबंधित करता है)। इसी तरह, सभी उपनिर्देशिकाओं को / home / alice / Documents के अंतर्गत सूचीबद्ध करने के लिए उपयोग करेंls -d /home/alice/Documents/*/
*/
किसी भी छिपे हुए फ़ोल्डर से मेल नहीं खाएगा। उन्हें शामिल करने के लिए, या तो उन्हें स्पष्ट रूप से निर्दिष्ट करें ls -d .*/ */
, या बैश में विकल्प सेट करेंdotglob
।
ls
मौजूद नहीं है।
ls */
बस के लिए विस्तारित होगा ls
, जो वर्तमान निर्देशिका में सभी फ़ाइलों को सूचीबद्ध करेगा। मुझे पूरा यकीन है कि आप उस मामले में नहीं चाहते हैं।
echo
उदाहरण: echo */
, echo */*/
यहाँ मैं क्या मिला है:
cs/ draft/ files/ hacks/ masters/ static/
cs/code/ files/images/ static/images/ static/stylesheets/
ls
केवल का उपयोग करनाउदाहरण: ls -d */
यहाँ ठीक वही है जो मुझे मिला:
cs/ files/ masters/
draft/ hacks/ static/
या सूची के रूप में (विस्तार से जानकारी के साथ): ls -dl */
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
उदाहरण: 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/
3
मेरे लिए दूसरों की तुलना में काफ़ी धीमा था। निर्देशिका में मैंने परीक्षण किया: 1
.012, 2
.016, 3
.055 , 4
.021।
1
, मेरा पसंदीदा है।
time
, यूनिक्स फ़ंक्शन। /// मैं सहमत हूँ, echo */
की तुलना में चतुर है ls -d */
।
1.
विकल्प प्रमुख दर्द का कारण होगा जब फ़ोल्डरों ऐसे नाम हैं जो रिक्त स्थान है गिर्द घूमती है।
मैं उपयोग करता हूं:
ls -d */ | cut -f1 -d'/'
यह एक एकल स्तंभ बनाता है जिसमें कोई अनुगामी स्लैश नहीं है - लिपियों में उपयोगी।
मेरे दो सेंट।
-1
के लिए विकल्प ls
एकल-स्तंभ प्रारूप में इच्छा उत्पादन में, साथ ही ls -1 -d */
।
-1
अभी भी हर प्रविष्टि के लिए एक अनुगामी स्लैश आउटपुट है।
.bashrc
उपनाम के रूप में जोड़ता हूं, तो मैं कैसे जोड़ूं '/'
?
'\/'
| sed -e 's-/$--'
सबफ़ोल्डर के बिना सभी फ़ोल्डरों के लिए :
find /home/alice/Documents -maxdepth 1 -type d
सभी फ़ोल्डर के लिए के साथ उप-फ़ोल्डर:
find /home/alice/Documents -type d
find /home/alice/Documents -maxdepth 1 -mindepth 1 -type d
अन्यथा आप /home/alice/Documents
खुद को शामिल करते हैं । साथ निर्देशिका के लिए सिमलिंक, उपसर्ग शामिल करने के लिए-L
एक निर्विवाद तारांकन *
शैल द्वारा एक पैटर्न (ग्लोब) के रूप में व्याख्या की जाएगी।
शेल इसका उपयोग पथनाम विस्तार में करेगा।
यह तब पैटर्न से मेल खाने वाले फ़ाइलनामों की एक सूची तैयार करेगा।
एक साधारण तारांकन PWD (वर्तमान वर्किंग डायरेक्टरी) में सभी फाइलनाम से मेल खाएगा।
एक अधिक जटिल पैटर्न के रूप में */
सभी फाइलनाम से मेल खाता है जो अंत में होता है /
।
इस प्रकार, सभी निर्देशिका। यही कारण है कि आदेश:
echo */
echo ./*/ ### avoid misinterpreting filenames like "-e dir"
echo
PWD में सभी निर्देशिकाओं के लिए (शेल द्वारा) विस्तारित किया जाएगा ।
इसका परीक्षण करने के लिए: एक निर्देशिका बनाएं ( 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 */
हालांकि, यह कमांड (कुछ हद तक) कम विश्वसनीय है। यह ऊपर सूचीबद्ध अजीब नाम वाली फ़ाइलों के साथ विफल हो जाएगा। यह कई नामों से घुट जाएगा। जब तक आप समस्या वाले लोगों को नहीं ढूंढ लेते तब तक आपको एक-एक करके मिटाने की जरूरत है।
जीएनयू ls
"विकल्पों के अंत" ( --
) कुंजी को स्वीकार करेगा ।
ls -d ./*/ ### more reliable BSD ls
ls -d -- */ ### more reliable GNU ls
प्रत्येक निर्देशिका को अपनी पंक्ति में (एक कॉलम में, 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
)।अंत में, किसी फ़ंक्शन के अंदर तर्क सूची का उपयोग करने से वर्तमान चल रहे शेल की तर्क सूची पर कोई प्रभाव नहीं पड़ेगा। सीधे शब्दों में:
$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs
इस सूची को प्रस्तुत करता है:
--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var
यह विकल्प कई प्रकार के विषम फ़ाइलनामों के साथ सुरक्षित हैं।
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
मैन ट्री के साथ और भी तर्क देखे जा सकते हैं
यदि आप सोच रहे हैं कि 'ls -d * /' से आउटपुट आपको दो ट्रेलिंग स्लैश क्यों देता है , जैसे:
[prompt]$ ls -d */
app// cgi-bin// lib// pub//
यह शायद इसलिए है क्योंकि कहीं न कहीं आपका शेल या सेशन अलियास एलएस कमांड को एलएस के एक संस्करण के लिए फाइल करता है जिसमें -F फ्लैग शामिल है। यह ध्वज एक चरित्र को प्रत्येक आउटपुट नाम (जो एक सादा फ़ाइल नहीं है) को इंगित करता है कि यह किस तरह की चीज़ है। तो एक स्लैश पैटर्न '* /' के मिलान से है, और दूसरा स्लैश एप्लाइड टाइप इंडिकेटर है।
इस समस्या से छुटकारा पाने के लिए, आप निश्चित रूप से ls के लिए एक अलग उपनाम परिभाषित कर सकते हैं। हालाँकि, उर्फ को अस्थायी रूप से आमंत्रित नहीं करने के लिए, आप बैकलैश के साथ कमांड को प्रीपेंड कर सकते हैं:
\ ls -d * /
मैं इसे केवल अपनी .bashrc
फ़ाइल में जोड़ता हूं (आप इसे केवल कमांड लाइन पर टाइप कर सकते हैं यदि आपको केवल एक सत्र के लिए इसकी आवश्यकता है / चाहते हैं)
alias lsd='ls -ld */'
तब lsd वांछित परिणाम देगा।
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 '(?=/$)'
यदि छिपी निर्देशिका को सूचीबद्ध करने की आवश्यकता नहीं है, तो मैं प्रस्तुत करता हूं:
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
, तो कृपया इस उत्तर को देखें
बिना फ़ोल्डर सूची दिखाने के लिए /
ls -d */|sed 's|[/]||g'
ls -d1 */ | tr -d "/"
यहाँ मैं उपयोग कर रहा हूँ
ls -d1 /Directory/Path/*;
ls -d1 /Directory/Path/*/
परीक्षण करें कि क्या आइटम एक निर्देशिका है test -d
:
for i in $(ls); do test -d $i && echo $i ; done
*/
एक फ़ाइल नाम मिलान पैटर्न है जो वर्तमान निर्देशिका में निर्देशिकाओं से मेल खाता है।
केवल निर्देशिकाओं को सूचीबद्ध करने के लिए, मुझे यह फ़ंक्शन पसंद है:
# 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'
}
FYI करें, यदि आप मल्टी-लाइन में सभी फाइलों को प्रिंट करना चाहते हैं, तो आप ऐसा कर सकते हैं ls -1
जो प्रत्येक फाइल को एक अलग लाइन में प्रिंट करेगा। file1 file2 file3
मैंने आंशिक रूप से हल किया:
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
खैर, यह मेरे लिए कम, मेयर भाग :)
इसे पूर्ण सर्कल में जोड़ने के लिए, प्रत्येक फ़ोल्डर के पथ को पुनः प्राप्त करने के लिए, अल्बर्ट के उत्तर के साथ-साथ गोर्डन्स के संयोजन का उपयोग करें जो कि बहुत उपयोगी होना चाहिए।
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/
पर्ल का उपयोग करना:
ls | perl -nle 'print if -d;'
यहाँ मैं केवल निर्देशिका नामों को सूचीबद्ध करने के लिए उपयोग करता हूँ:
ls -1d /some/folder/*/ | awk -F "/" "{print \$(NF-1)}"
मूल प्रश्न का उत्तर देने के लिए, प्रति से */
कुछ लेना देना नहीं ls
है; यह शेल / बैश द्वारा किया जाता है, एक प्रक्रिया में ग्लोबिंग के रूप में जाना जाता है ।
यही कारण है कि echo */
और ls -d */
समान तत्वों को आउटपुट करता है। ( -d
ध्वज ls
निर्देशिका नामों को आउटपुट करता है न कि निर्देशिकाओं की सामग्री को।)
यहां पेड़ का उपयोग करके एक भिन्नता है जो निर्देशिका नामों को केवल अलग लाइनों पर आउटपुट करता है, हाँ यह बदसूरत है लेकिन हे, यह काम करता है।
tree -d | grep -E '^[├|└]' | cut -d ' ' -f2
या जाग के साथ
tree -d | grep -E '^[├|└]' | awk '{print $2}'
यह शायद बेहतर है लेकिन /
बाद में निर्देशिका नाम को बनाए रखेगा ।
ls -l | grep "^d" | awk '{print $9}'
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
केवल निर्देशिकाओं की लिस्टिंग के लिए अब तक का सबसे छोटा कमांड (वास्तव में हैक)। ब्याज निर्देशिका की पूर्ण पथ या सापेक्ष पथ में टाइप करें और ब्याज की निर्देशिका में प्रवेश करने के लिए हिट दर्ज करें। अब टैब कीcd
और टाइप करें । अब केवल निर्देशिका दिखाई जाती हैं।
user@ubuntu:~/Desktop$cd <tab key>
उपर्युक्त कमांड को अब डेस्कटॉप में केवल फ़ोल्डर प्रदर्शित करना चाहिए । सबसे छोटा वास्तव में।
-d
वास्तव में इसका क्या मतलब है।