আমি চাই আমার শেল স্ক্রিপ্টটি একটি প্রধান ডিরেক্টরিতে সমস্ত উপ-ডিরেক্টরিতে গিয়ে দেখুক। ডিরেক্টরিতে কিছু করুন, একটি স্পুল ফাইলে প্রেরিত আউটপুট এবং পরবর্তী ডিরেক্টরিতে যান। মেইন দিরকে বিবেচনা করুন = / টিএমপি সাব দির = এবিসিডি (চারটি সাব ডিরেক্টরি)
আমি চাই আমার শেল স্ক্রিপ্টটি একটি প্রধান ডিরেক্টরিতে সমস্ত উপ-ডিরেক্টরিতে গিয়ে দেখুক। ডিরেক্টরিতে কিছু করুন, একটি স্পুল ফাইলে প্রেরিত আউটপুট এবং পরবর্তী ডিরেক্টরিতে যান। মেইন দিরকে বিবেচনা করুন = / টিএমপি সাব দির = এবিসিডি (চারটি সাব ডিরেক্টরি)
উত্তর:
একটি for
লুপ ব্যবহার করুন :
for d in $(find /path/to/dir -maxdepth 1 -type d)
do
#Do something, the directory is accessible with $d:
echo $d
done >output_file
এটি কেবল ডিরেক্টরিটির উপ-ডিরেক্টরি অনুসন্ধান করে /path/to/dir
। নোট করুন যে ডিরেক্টরিগুলির নামগুলিতে সাদা স্থান বা বিশেষ অক্ষরগুলি অন্তর্ভুক্ত থাকলে উপরের সহজ উদাহরণটি ব্যর্থ হবে। একটি নিরাপদ পদ্ধতি হল:
find /tmp -maxdepth 1 -type d -print0 |
while IFS= read -rd '' dir; do echo "$dir"; done
বা সরলভাবে bash
:
for d in /path/to/dir/*; do
if [ -d "$d" ]; then
echo "$d"
fi
done
(নোট করুন যে এর বিপরীতে find
ডিরেক্টরিতে প্রতিলিঙ্কগুলি বিবেচনা করে এবং লুকানোগুলি বাদ দেয়)
find
।
date +"%m%d20%Y"
| xargs প্রতিধ্বনি $ d
date +"%m%d20%Y"
| xargs প্রতিধ্বনি প্রতিধ্বনিত $ d প্রত্যাশিত ফলাফলটি সমস্ত উপ-ডিরেক্টরি থেকে ls -ltr হবে । উপরে লুপ কাজ করছে না
আমি সম্পূর্ণ bash
নবাগত, তবে ইউএন * এক্স অভিজ্ঞ। যদিও নিঃসন্দেহে এটি ব্যাশ শেল স্ক্রিপ্টিংয়ে করা যায়, পুরানো দিনগুলিতে আমরা find [-maxdepth <levels>] <start-dir> -exec <command> ;
এটি অর্জন করতাম । আপনি এটি করতে man find
এবং চারপাশে খেলতে পারতেন , যতক্ষণ না কেউ আপনাকে কীভাবে এটি করতে হয় তাকে বলা অবধি bash
!
find
কমান্ড চালনার ওভারহেড এড়ানো যায় ।
$(find...)
জিনিস খারাপ অভ্যাস ।
দেখে মনে হচ্ছে আপনি প্রতিটি সাবডায়ারের অধীনে ফাইলের নাম চান; ls -l | awk
শক্তসমর্থ যথেষ্ট, যদি ঐ ফাইলের নামের হোয়াইটস্পেস এবং / বা নতুন লাইন গঠিত জন্য নয়? নীচে find
এমনকি তাদের জন্য কাজ করবে find
না যে ডোনোট -maxdepth
তাদের জন্য কাজ করবে:
find . ! -name . -type d -prune -exec sh -c '
cd "$1" && \
find "." ! -name . -prune -type f
' {} {} \;
এলএস, গ্রেপ এবং টিআর ব্যবহার করে এটিও সম্ভব
for dir in $(ls -1FA | grep / | tr -d /); do echo $dir/something; done
ls -1FA | grep / | tr -d / | while IFS= read -r TD; do echo $TD/something; done
du / সেড এছাড়াও নির্বাচক হিসাবে ব্যবহার করা যেতে পারে যদি আপনার এলএস এর উপরের বিকল্পগুলির অভাব থাকে
du --max-depth=1 | sed -e 's/^.*\.\///' | grep -v '\.$'
এই উদাহরণগুলি লুকিয়ে থাকা ডিরেক্টরিগুলি ফিরে আসে এবং পিতামাতার এবং বর্তমান ডিরেক্টরিগুলি বাদ দেয় তা লক্ষ করা গুরুত্বপূর্ণ important
ls
প্রতি লাইনে একটি ফাইল ( -1
বিকল্পটি কী সুনির্দিষ্ট করে) লিখবে (সুতরাং এটি আপনার উত্তরগুলিতে অতিমাত্রায়)। (2) আউটপুট পার্সিং ls
একটি খারাপ ধারণা - দেখুন এই এবং এই । ডিরেক্টরিগুলির নামগুলিতে স্পেস (বা নিউলাইন) থাকলে আপনার প্রথম উত্তরটি ব্যর্থ হবে এবং তাদের নামে নতুন লাইন থাকলে সমস্ত ব্যর্থ হবে। (3) আপনার সর্বদা শেল ভেরিয়েবলগুলি উদ্ধৃত করা উচিত (উদাহরণস্বরূপ, "$dir"
) যদি আপনার না জরুরী কারণ না থাকে এবং আপনি নিশ্চিত হন যে আপনি কী করছেন তা নিশ্চিত।