আমি বেশ কয়েক বছর ধরে BASH ব্যবহার করছি, যদিও BASH স্ক্রিপ্টিংয়ের সাথে আমার অভিজ্ঞতা তুলনামূলকভাবে সীমাবদ্ধ।
আমার কোডটি নীচের মতো। এটি বর্তমান ডিরেক্টরি ভিতরে পুরো ডিরেক্টরি কাঠামো দখল এবং এটিকে প্রতিলিপি করা উচিত $OUTDIR
।
for DIR in `find . -type d -printf "\"%P\"\040"`
do
echo mkdir -p \"${OUTPATH}${DIR}\" # Using echo for debug; working script will simply execute mkdir
echo Created $DIR
done
সমস্যাটি হচ্ছে, এখানে আমার ফাইল কাঠামোর একটি নমুনা রয়েছে:
$ ls
Expect The Impossible-Stellar Kart
Five Iron Frenzy - Cheeses...
Five Score and Seven Years Ago-Relient K
Hello-After Edmund
I Will Go-Starfield
Learning to Breathe-Switchfoot
MMHMM-Relient K
স্পেসগুলি নোট করুন: -S এবং for
শব্দ অনুসারে প্রতিটি পরামিতি নেয়, তাই আমার স্ক্রিপ্টের আউটপুটটি এরকম কিছু দেখাচ্ছে:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Learning"
Created Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot"
Created Breathe-Switchfoot
তবে এর আউটপুট থেকে পুরো ফাইলের নাম (একবারে একটি লাইন) দখল করা আমার দরকার find
। আমি find
প্রতিটি ফাইলের নামের চারপাশে ডাবল-কোট তৈরি করার চেষ্টা করেছি। তবে এটি কোনও উপকারে আসে না।
for DIR in `find . -type d -printf "\"%P\"\040"`
এবং এই পরিবর্তিত রেখার সাথে আউটপুট:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"""
Created ""
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"Learning"
Created "Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot""
Created Breathe-Switchfoot"
এখন, আমার এমন কিছু উপায়ের প্রয়োজন যা আমি এর মাধ্যমে পুনরাবৃত্তি করতে পারি, কারণ আমি gstreamer
নিম্নলিখিত ফাইলের সাথে অনুরূপ আরও কাঠামোযুক্ত আরও জটিল কমান্ড চালাতে চাই । আমার এটি কীভাবে করা উচিত?
সম্পাদনা: আমার একটি কোড কাঠামো প্রয়োজন যা আমাকে প্রতিটি ডিরেক্টরি / ফাইল / লুপের জন্য একাধিক লাইন কোড চালানোর অনুমতি দেয়। আমি অস্পষ্ট থাকলে দুঃখিত।
সমাধান: আমি প্রথমে চেষ্টা করেছি:
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
এটি বেশিরভাগ অংশের জন্য দুর্দান্ত কাজ করেছে। যাইহোক, আমি পরে দেখতে পেয়েছি যে পাইপটির ফলাফল যখন সাব-শেলের সাথে চলতে চলতে লুপের ফলাফল দেয়, লুপে সেট করা কোনও ভেরিয়েবলগুলি পরে অনুপলব্ধ থাকে যা একটি ত্রুটি কাউন্টার প্রয়োগ করা বেশ কঠিন করে তোলে। আমার চূড়ান্ত সমাধান ( এসও এর উত্তর থেকে ):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
এটি পরে আমাকে লুপের মধ্যে শর্তসাপেক্ষে ইনক্রিমেন্ট ভেরিয়েবলগুলি অনুমতি দেয় যা স্ক্রিপ্টে পরে উপলব্ধ থাকবে।
/
আর অচিরাচরিত অক্ষর ছাড়া অন্য কিছুকে অনুমতি দেব । তবে কিছু ব্যতীত অনুমোদিত /
এবং \0
তাই আপনাকে অবশ্যই এটিকে অনুমতি দেওয়া উচিত।