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 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 .
සෑම විටම සැඟවුණු නාමාවලි ඇතුළත් වේ (සහ වර්තමාන ඩිර් ද)
මූල ඩිරෙක්ටරිය හැරුණු විට වර්තමාන වැඩ කරන නාමාවලිය තුළ දෘශ්ය හා සැඟවුණු නාමාවලි සොයා ගැනීම සඳහා මෙය සිදු කෙරේ:
නාමාවලි හරහා ලූප් කිරීමට:
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 dotglob
zsh වලින්)
ඔබට ඩොට්ග්ලොබ් සමඟ සැකසිය නොහැක
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