উত্তর:
আপনি কেবল ডিরেক্টরিগুলির সাথে মেলে শেষে স্ল্যাশ নির্দিষ্ট করতে পারেন:
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 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
ফলাফল মধ্যে symlinks অন্তর্ভুক্ত:
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' এর পরিবর্তে 'বাশ-সি' ইত্যাদি ব্যবহার করতে পারেন
... -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জেডএসে)
আপনি ডটগ্লোব আনসেট করতে পারেন
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/ পার্সিংএলস