जवाबों:
आप केवल निर्देशिका से मिलान करने के लिए अंत में एक स्लैश निर्दिष्ट कर सकते हैं:
for d in */ ; do
echo "$d"
done
[[ -L $d ]]
कि क्या $ d एक प्रतीकात्मक लिंक है।
set -P
केवल उन कमांड्स को प्रभावित करता है जो निर्देशिका बदलते हैं। sprunge.us/TNac
[[ -L "$f" ]]
इस मामले में सहानुभूति को बाहर नहीं करेगा */
, आपको ट्रेलिंग स्लैश को स्ट्रिप करना होगा ( ट्रायल स्लैश के साथ लिंक के लिए टेस्ट[[ -L "${f%/}" ]]
देखें )
आप इसके साथ परीक्षण कर सकते हैं -d
:
for f in *; do
if [ -d "$f" ]; then
# $f is a directory
fi
done
if [[ -d "$f" && ! -L "$f" ]]
सिम्बलिंक को बाहर करेगा
if [[ "$f" = "*" ]]; then continue; fi
उस चोराबा के समाधान से सावधान रहें, हालांकि सुरुचिपूर्ण, अप्रत्याशित व्यवहार को हटा सकता है यदि कोई निर्देशिका वर्तमान निर्देशिका के भीतर उपलब्ध नहीं है। इस स्थिति में, for
लूप स्किप करने के बजाय , बैश लूप को ठीक उसी समय चलाएगा, जब d
वह बराबर होता है */
:
#!/usr/bin/env bash
for d in */; do
# Will print */ if no directories are available
echo $d
done
मैं इस मामले से बचाव के लिए निम्नलिखित का उपयोग करने की सलाह देता हूं:
#!/usr/bin/env bash
for f in *; do
if [ -d ${f} ]; then
# Will not run if no directories are available
echo $f
fi
done
यह कोड वर्तमान निर्देशिका में सभी फ़ाइलों के माध्यम से लूप करेगा, यदि f
कोई निर्देशिका है, तो यह जांचें कि क्या f
स्थिति सही है या नहीं। यदि f
समान है */
, echo $f
तो निष्पादित नहीं करेगा।
shopt -s nullglob
।
यदि आपको केवल निर्देशिकाओं के उपयोग से अधिक विशिष्ट फ़ाइलों का चयन करने की आवश्यकता है, तो find
इसे पास करें while read
:
shopt -s dotglob
find * -prune -type d | while IFS= read -r d; do
echo "$d"
done
shopt -u dotglob
छिपी निर्देशिका (या setopt dotglob
/ unsetopt dotglob
zsh में) को बाहर करने के लिए उपयोग करें ।
IFS=
$IFS
उदाहरण के लिए, इनमें से किसी एक को विभाजित करने वाले फ़ाइल नाम से बचने के लिए:'a b'
देख AsymLabs का जवाब और अधिक के लिए नीचे दिए गए find
विकल्पों में
संपादित करें:
यदि आपको लूप के भीतर से बाहर निकलने का मूल्य बनाने की आवश्यकता होती है, तो आप इस ट्रिक द्वारा अतिरिक्त उपधारा को दरकिनार कर सकते हैं:
while IFS= read -r d; do
if [ "$d" == "something" ]; then exit 1; fi
done < <(find * -prune -type d)
आप इसके लिए शुद्ध बैश का उपयोग कर सकते हैं, लेकिन इसका उपयोग करना बेहतर है:
find . -maxdepth 1 -type d -exec echo {} \;
(अतिरिक्त रूप से छिपे निर्देशिकाओं को शामिल करें)
shopt -s dotglob
लिए उपयोग कर सकते हैं bash
। तुम्हारा भी शामिल होगा .
। यह भी ध्यान दें कि -maxdepth
एक मानक विकल्प नहीं है ( -prune
है)।
dotglob
विकल्प दिलचस्प है, लेकिन dotglob
केवल के उपयोग पर लागू *
। find .
हमेशा छिपी निर्देशिका (और वर्तमान dir के रूप में)
वर्तमान निर्देशिका के भीतर दृश्यमान और छिपी हुई निर्देशिकाओं को खोजने के लिए यह किया जाता है, मूल निर्देशिका को छोड़कर:
केवल निर्देशिका के माध्यम से लूप करने के लिए:
find -path './*' -prune -type d
परिणाम में सिमिलिंक शामिल करने के लिए:
find -L -path './*' -prune -type d
प्रत्येक निर्देशिका के लिए कुछ करने के लिए (सिमिलिंक को छोड़कर):
find -path './*' -prune -type d -print0 | xargs -0 <cmds>
छिपी निर्देशिका को बाहर करने के लिए:
find -path './[^.]*' -prune -type d
लौटाए गए मूल्यों पर कई आदेशों को निष्पादित करने के लिए (एक बहुत ही आकस्मिक उदाहरण):
find -path './[^.]*' -prune -type d -print0 | xargs -0 -I '{}' sh -c \
"printf 'first: %-40s' '{}'; printf 'second: %s\n' '{}'"
'श-सी' के बजाय 'बैश-सी' आदि का भी उपयोग कर सकते हैं।
... -print0 | xargs -0 ...
अगर आपको नहीं पता कि सटीक नाम क्या हैं।
find * | while read file; do ...
आप सभी निर्देशिकाओं के माध्यम से लूप कर सकते हैं, जिसमें छिपी निर्देशिका (डॉट के साथ शुरुआत) एक लाइन में है और इसके साथ कई कमांड हैं:
for file in */ .*/ ; do echo "$file is a directory"; done
यदि आप सिमिलिंक को बाहर करना चाहते हैं:
for file in *; do
if [[ -d "$file" && ! -L "$file" ]]; then
echo "$file is a directory";
fi;
done
नोट: सूची का उपयोग */ .*/
कार्य में होता है, लेकिन फ़ोल्डर्स को भी प्रदर्शित करता है .
और ..
zsh में यह इनको नहीं दिखाएगा, लेकिन यदि फ़ोल्डर में कोई छिपी हुई फ़ाइल नहीं है, तो उसे फेंक दें
एक क्लीनर संस्करण जिसमें छिपी निर्देशिका शामिल होगी और बाहर रखा जाएगा .. / डॉटग्लोब विकल्प के साथ होगा:
shopt -s dotglob
for file in */ ; do echo "$file is a directory"; done
(या setopt dotglob
zsh में)
आप डॉटग्लोब को परेशान कर सकते हैं
shopt -u dotglob
यह सूची में प्रत्येक निर्देशिका में पूरा पथ शामिल करेगा:
for i in $(find $PWD -maxdepth 1 -type d); do echo $i; done
का प्रयोग करें find
साथ -exec
निर्देशिका लूप करने के लिए और एक फोन समारोह कार्यकारी विकल्प में:
dosomething () {
echo "doing something with $1"
}
export -f dosomething
find -path './*' -prune -type d -exec bash -c 'dosomething "$0"' {} \;
छिपी हुई निर्देशिकाओं का उपयोग करना shopt -s dotglob
या shopt -u dotglob
शामिल करना / बाहर करना
ls -l | grep ^d
या:
ll | grep ^d
आप इसे एक उपनाम के रूप में सेट कर सकते हैं
ls
आधारित उत्तर की तुलना में थोड़ा अलग है , जो निर्देशिकाओं को सूचीबद्ध करता है ।
ls
: mywiki.wooledge.org/ParsingLs