আপনি যদি জিএনইউ ব্যবহার করেন তবে আপনি প্যারামিটার find
চেষ্টা করতে পারেন -execdir
, যেমন:
find . -type d -execdir realpath "{}" ';'
বা ( @gniourf_gniourf মন্তব্য অনুসারে ):
find . -type d -execdir sh -c 'printf "%s/%s\n" "$PWD" "$0"' {} \;
দ্রষ্টব্য: আপনি সামনের দিকে ঠিক করার ${0#./}
পরিবর্তে ব্যবহার করতে পারেন ।$0
./
বা আরও ব্যবহারিক উদাহরণ:
find . -name .git -type d -execdir git pull -v ';'
আপনি যদি বর্তমান ডিরেক্টরি অন্তর্ভুক্ত করতে চান তবে এটি ব্যবহার করে আরও সহজ -exec
:
find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;
বা ব্যবহার xargs
:
find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'
বা অনুরূপ উদাহরণ @gniourf_gniourf দ্বারা প্রস্তাবিত :
find . -type d -print0 | while IFS= read -r -d '' file; do
# ...
done
উপরোক্ত উদাহরণগুলি তাদের নামে স্পেস সহ ডিরেক্টরিগুলি সমর্থন করে।
বা ব্যাশ অ্যারেতে বরাদ্দ করে:
dirs=($(find . -type d))
for dir in "${dirs[@]}"; do
cd "$dir"
echo $PWD
done
.
আপনার নির্দিষ্ট ফোল্ডারের নাম পরিবর্তন করুন । আপনার যদি পুনরাবৃত্তভাবে চালনার দরকার না হয় তবে আপনি এর dirs=(*)
পরিবর্তে ব্যবহার করতে পারেন । উপরের উদাহরণটি নামের ফাঁকা জায়গায় ডিরেক্টরিগুলি সমর্থন করে না।
সুতরাং @gniourf_gniourf এর পরামর্শ অনুসারে, স্পষ্ট লুপটি ব্যবহার না করে সন্ধানের আউটপুটটি অ্যারেতে রাখার একমাত্র সঠিক উপায়টি 4.4 বাশনের সাথে পাওয়া যাবে:
mapfile -t -d '' dirs < <(find . -type d -print0)
বা প্রস্তাবিত উপায় নয় (যার মধ্যে পার্সিংls
অন্তর্ভুক্ত ):
ls -d */ | awk '{print $NF}' | xargs -n1 sh -c 'cd $0 && pwd && echo Do stuff'
উপরের উদাহরণটি বর্তমান দিরকে উপেক্ষা করবে (ওপি দ্বারা অনুরোধ করা হয়েছে), তবে এটি ফাঁকা জায়গাগুলির সাথে নাম ভাঙবে।
আরো দেখুন:
cd "$d"
এটি আরও ভাল হয় যে এটি এমন পরিস্থিতিতে স্থানান্তর করে যেখানে ওয়াইল্ডকার্ড ফাইলগুলির সাথে মেলে যাঁদের নামের সাথে শ্বেতস্পেস এবং / অথবা শেল মেটাচার্যাক্টর রয়েছে।