আমি যদি কোনও লুপের জন্য কোনও ডিরেক্টরিকে পুনরাবৃত্তি করি তবে কেবলমাত্র একটি ফাইলের ফাইলের নাম প্রতিধ্বনি সম্পর্কে কী করব?
for filename in /home/user/*
do
echo $filename
done;
ফাইলের নাম সহ পুরো পথটি টানবে। আমি শুধু ফাইলের নাম চাই।
আমি যদি কোনও লুপের জন্য কোনও ডিরেক্টরিকে পুনরাবৃত্তি করি তবে কেবলমাত্র একটি ফাইলের ফাইলের নাম প্রতিধ্বনি সম্পর্কে কী করব?
for filename in /home/user/*
do
echo $filename
done;
ফাইলের নাম সহ পুরো পথটি টানবে। আমি শুধু ফাইলের নাম চাই।
উত্তর:
আপনি যদি একটি দেশীয় bash
সমাধান চান
for file in /home/user/*; do
echo "${file##*/}"
done
উপরের অংশগুলিতে প্যারামিটার এক্সপেনশন ব্যবহার করা হয় যা শেলের আদি এবং এটি কোনও বাহ্যিক বাইনারি যেমন কল প্রয়োজন হয় নাbasename
তবে, আমি কেবল ব্যবহার করার পরামর্শ দিতে পারি find
find /home/user -type f -printf "%f\n"
${file##*/}
করতে পরিবর্তনগুলি বিবেচনা করুন "${file##*/}"
যেমন "স্পেস.টেক্সট সহ আমার ফাইল নাম"।
শুধু ব্যবহার করুন basename
:
echo `basename "$filename"`
ফাইলের নাম যেমন শূন্যস্থান রয়েছে সে ক্ষেত্রে উদ্ধৃতিগুলি প্রয়োজনীয়।
$()
অলির মতো ব্যবহার করা আরও ভাল
/test 1
, basename $(pwd)
আউটপুট: test
। ওএস এক্স এবং উবুন্টু সার্ভারে পরীক্ষিত (14.04)। নেটিভ বাশ সলিউশন, যেমন @ সিজেএক্সএক্স প্রস্তাবিত, আমার পক্ষে কাজ করেছে।
basename "$(pwd)"
পরিবর্তে @ মার্কোগ্রিক ব্যবহার করুন।
$PWD
কমান্ড চালানোর পরিবর্তে ভেরিয়েবল ব্যবহার করা ভাল ।
ব্যবহার basename
:
echo $(basename /foo/bar/stuff)
echo
? basename
ইতিমধ্যে ফলাফল মুদ্রণ। echo
এমনকি যদি আপনি সাব-শেলটি উদ্ধৃতি না করেন তবে ফলাফলটি ম্যাঙ্গেলও করতে পারে। উদাহরণ: echo $(basename path/with\ \ spaces)
ভুলভাবে মুদ্রণ with spaces
(একমাত্র স্থান)।
ls
ডিরেক্টরিতে ফাইল তালিকাটি পড়ার সময় আরেকটি পদ্ধতির ব্যবহার হ'ল যাতে আপনি যা চান তা দিতে পারেন, যেমন "কেবলমাত্র ফাইলের নাম / গুলি"। সম্পূর্ণ ফাইল পাথটি পড়ার বিরোধিতা এবং তারপরে ফর লুপের শরীরে "ফাইলের নাম" উপাদানটি বের করা।
এর নীচে উদাহরণগুলি আপনার আসলটি অনুসরণ করে:
for filename in $(ls /home/user/)
do
echo $filename
done;
আপনি যদি ফাইলগুলির মতো একই ডিরেক্টরিতে স্ক্রিপ্টটি চালাচ্ছেন তবে তা কেবল হয়ে যায়:
for filename in $(ls)
do
echo $filename
done;
ls
এমন কোনও ডটফাইল অন্তর্ভুক্ত রয়েছে যেখানে *
প্রসার সাধারণত হয় না। এছাড়াও for f in $(...) ...
ব্যর্থ কোনো ফাইলের নাম হোয়াইটস্পেস যদি না আপনি IFS সেট, ব্যর্থ হতে পারে যদি থাকে ফাইলের নাম যদি না আপনি -f / -o noglob সেট করুন, এবং সিস্টেম বা শেল উপর নির্ভর করে একটি উল্লিখিত glob গৃহস্থালির কাজ রয়েছে থাকে echo
যদি থাকে ফাইলের নাম হাইফেন + অক্ষর বা ব্যাকস্ল্যাশ রয়েছে বিফল হতে পারে। OTOH কেবল ls -1 /path/to/dir
নিজেরাই প্রতিটি ফাইলের নাম একটি লাইনে নির্ভরযোগ্যভাবে মুদ্রণ করে, ডটফাইলের পার্থক্যকে মডিউল করে।
আপনি যদি কেবল ফাইলের নাম চান:
for file in /home/user/*; do
f=$(echo "${file##*/}");
filename=$(echo $f| cut -d'.' -f 1); #file has extension, it return only filename
echo $filename
done
cut
কমান্ড সম্পর্কে আরও তথ্যের জন্য এখানে দেখুন ।