Answers:
නාමාවලි වලට පමණක් ගැලපෙන පරිදි ඔබට අවසානයේ කප්පාදුවක් නියම කළ හැකිය:
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" ]]symlinks බැහැර කරනු ඇත
if [[ "$f" = "*" ]]; then continue; fi
වත්මන් නාමාවලිය තුළ කිසිදු නාමාවලියක් නොමැති නම් චොරොබාගේ විසඳුම අලංකාර වුවත් අනපේක්ෂිත ලෙස හැසිරීමට හැකි බව පරෙස්සම් වන්න. මෙම තත්වය තුළ, forලූපය මඟ හැරීම වෙනුවට , bash 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 dotglobzsh වලින්).
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 .සෑම විටම සැඟවුණු නාමාවලි ඇතුළත් වේ (සහ වර්තමාන ඩිර් ද)
මූල ඩිරෙක්ටරිය හැරුණු විට වර්තමාන වැඩ කරන නාමාවලිය තුළ දෘශ්ය හා සැඟවුණු නාමාවලි සොයා ගැනීම සඳහා මෙය සිදු කෙරේ:
නාමාවලි හරහා ලූප් කිරීමට:
find -path './*' -prune -type d
ප්රති result ලයට සිම්ලින්ක් ඇතුළත් කිරීමට:
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' '{}'"
'sh -c' වෙනුවට 'bash -c' ආදිය භාවිතා කළ හැකිය.
... -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
සටහන: ලැයිස්තුව භාවිතා */ .*/bash කෘති, පමණක් නොව, ෆෝල්ඩර පෙන්වයි .හා ..zsh එය මෙම පෙන්වන්න නමුත් ෆෝල්ඩරය තුළ කිසිදු සැඟවුණු ගොනු තිබේ නම්, දෝෂයක් විසි නැහැ අතර
සැඟවුණු නාමාවලි ඇතුළත් සහ බැහැර කරන පිරිසිදු අනුවාදයක් ../ dotglob විකල්පය සමඟ වනු ඇත:
shopt -s dotglob
for file in */ ; do echo "$file is a directory"; done
(හෝ setopt dotglobzsh වලින්)
ඔබට ඩොට්ග්ලොබ් සමඟ සැකසිය නොහැක
shopt -u dotglob
ලැයිස්තුවේ එක් එක් නාමාවලියෙහි සම්පූර්ණ මාර්ගය මෙයට ඇතුළත් වේ:
for i in $(find $PWD -maxdepth 1 -type d); do echo $i; done
ඩිරෙක්ටරි හරහා ලූප් කිරීමට භාවිතා findකර exec විකල්පයේ ශ්රිතයක්-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