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