একটি ফোল্ডার এবং তালিকা ফাইলের মধ্য দিয়ে লুপ করুন


14

আমার কাছে 'নমুনা' নামে একটি ফোল্ডার রয়েছে এবং এতে এতে 3 টি ফাইল রয়েছে। আমি একটি শেল স্ক্রিপ্ট লিখতে চাই যা নমুনা ফোল্ডারের ভিতরে এই ফাইলগুলি পড়বে এবং কার্ল ব্যবহার করে এটি কোনও HTTP সাইটে পোস্ট করবে।

ফোল্ডারের ভিতরে ফাইল তালিকা করার জন্য আমি নিম্নলিখিতটি লিখেছি:

for dir in sample/*; do
        echo $dir;
        done

তবে এটি আমাকে নিম্নলিখিত ফলাফল দেয়:

sample/log

sample/clk

sample/demo

এটি এতে মূল ফোল্ডারটি সংযুক্ত করছে। আমি নিম্নলিখিত হিসাবে আউটপুট চাই (পিতা বা মাতা ফোল্ডারের নাম ছাড়া)

log

clk

demo

আমি এটা কিভাবে করবো?


1
প্রথমে 'সিডি' ব্যবহার করুন। আপনার যদি এটি 'কার্ল' প্রয়োজন হয়, আপনার এখনও ডিরেক্টরি প্রবেশ করতে হবে। এছাড়াও আপনি echo ${dir##*/}পথ বন্ধ করতে ব্যবহার করতে পারেন।
এক্সপ্রেস

উত্তর:


32

basenameফাইলগুলির অগ্রণী পথটি ছাঁটাই করতে ব্যবহার করুন :

for file in sample/*; do
    echo "$(basename "$file")"
done

যদিও কেন না:

( cd sample; ls )

3

আপনার শেলটিকে সমর্থন করে ধরে নিলে আপনি প্যারামিটার এক্সপেনশন ব্যবহার করতে পারেন

for path in sample/*; do
    printf -- '%s\n' "${path##*/}"
done

অথবা আপনি কেবল সেই ডিরেক্টরিতে পরিবর্তন করতে পারেন এবং সেখানে তালিকা তৈরি করতে পারেন


1
--এখানে প্রয়োজন হয় না। প্রথম যুক্তিটি কোনও ড্যাশযুক্ত একটি স্থির স্ট্রিং।
কুসালানন্দ

এছাড়াও, ${parameter##pattern}সমস্ত পসিক্স শেল দ্বারা সমর্থিত।
কুসালানন্দ

2

যেহেতু * নিক্স সিস্টেমগুলি প্রায় কোনও অক্ষরকে ফাইলের নামের অংশ হিসাবে অনুমতি দেয় (হোয়াইটস্পেস, নিউলাইনস, কমা, পাইপ প্রতীক ইত্যাদি সহ), আপনার কখনই শেল স্ক্রিপ্টে "ls" কমান্ডের আউটপুট বিশ্লেষণ করা উচিত নয়। এটি নির্ভরযোগ্য নয়। আপনার কেন এলএস আউটপুট বিশ্লেষণ করা উচিত নয় তা দেখুন ।

ফাইলগুলির একটি তালিকা তৈরি করতে "সন্ধান করুন" ব্যবহার করুন। আপনি যদি ব্যাশ ব্যবহার করে থাকেন তবে আপনি "সন্ধান" এর আউটপুটটিকে একটি অ্যারেতে sertোকাতে পারেন। নীচে উদাহরণস্বরূপ, আমি একটি অ-কাজকারী "কার্ল" কমান্ডটি ব্যবহার করেছি এমন সতর্কতার সাথে!

searchDir="sample/"
oldFiles=()
while IFS= read -r -d $'\0' foundFile; do
    oldFiles+=("$foundFile")
done < <(find "$searchDir" -maxdepth 1 -type f -print0 2> /dev/null)

if [[ ${#oldFiles[@]} -ne 0 ]]; then
    for file in "${oldFiles[@]}"; do
        curl -F data=@"$file" UPLOAD_ADDRESS
    done
fi

এখানে ডিরেক্টরি কি? $ '\ 0'? আমি একটি ডিরেক্টরি যা একটি ভেরিয়েবলের মধ্যে পাস করতে চাই ...
Soylent গ্রাহাম

সার্চডির ডিরেক্টরি ভেরিয়েবল। "-d $ '\ 0'" রিড কমান্ডের ডিলিমিটারকে বাতিল করে দেয়।
বিবি_রেফারি

আমি কীভাবে একই শেলটি অর্জন করব? আমি #! / বিন / শ
আইয়াসমান

1

এটি ডিরেক্টরিগুলির সাথে আপনি কী করতে চান তা নির্ভর করে।

নামটি মুদ্রণের জন্য, আপনি যে ডিরেক্টরি ব্যবহার করতে পারেন এটি ডিরেক্টরি এটি কিনা তা পরীক্ষা করে দেখুন:

ls -1 sample

আরও ভাল হবে, কারণ আপনি ফিল্টার ব্যবহার করতে পারেন:

find sample -type d -maxdepth 1 -printf '%f\n'

আপনি যদি ফাইলগুলিতে কমান্ডগুলি চালাতে চান তবে আপনার লুপের জন্য নয়, এটি ব্যবহার করা উচিত:

find sample -type d -maxdepth 1 -exec basename {} \;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.