একটি স্ট্রিং ফাইল পাথ দেওয়া যেমন /foo/fizzbuzz.bar
, আমি কীভাবে fizzbuzz
স্ট্রিংয়ের অংশটি বের করতে ব্যাশ ব্যবহার করব ?
একটি স্ট্রিং ফাইল পাথ দেওয়া যেমন /foo/fizzbuzz.bar
, আমি কীভাবে fizzbuzz
স্ট্রিংয়ের অংশটি বের করতে ব্যাশ ব্যবহার করব ?
উত্তর:
বাশে # এবং% অপারেটরদের সাথে এটি কীভাবে করা যায় তা এখানে।
$ x="/foo/fizzbuzz.bar"
$ y=${x%.bar}
$ echo ${y##*/}
fizzbuzz
${x%.bar}
${x%.*}
বিন্দুর ${x%%.*}
পরে সমস্ত কিছু মুছে ফেলা বা প্রথম বিন্দুর পরে সমস্ত কিছু সরিয়ে ফেলাও হতে পারে ।
উদাহরণ:
$ x="/foo/fizzbuzz.bar.quux"
$ y=${x%.*}
$ echo $y
/foo/fizzbuzz.bar
$ y=${x%%.*}
$ echo $y
/foo/fizzbuzz
ডকুমেন্টেশন বাশ ম্যানুয়ালটিতে পাওয়া যাবে । দেখুন ${parameter%word}
এবং ${parameter%%word}
অংশ ম্যাচিং অধ্যায় trailing।
বেসনাম কমান্ডটি দেখুন:
NAME="$(basename /foo/fizzbuzz.bar .bar)"
এটি অর্জনের জন্য আমি বেস ব্যবহার করে নিম্নলিখিত ব্যবহার করেছি:
for file in *; do
ext=${file##*.}
fname=`basename $file $ext`
# Do things with $fname
done;
এটির জন্য ফাইল এক্সটেনশনের কোনও পূর্বের জ্ঞান প্রয়োজন হয় না এবং এটির একটি ফাইলের নাম রয়েছে যা তার ফাইলনেটে বিন্দু রয়েছে (এটির এক্সটেনশনের সামনে); এটির জন্য প্রোগ্রামটি প্রয়োজন basename
তবে এটি জিএনইউ কোর্টিলগুলির একটি অংশ তাই এটি কোনও ডিস্ট্রো দিয়ে শিপিং করা উচিত।
fname=`basename $file .$ext`
খাঁটি বাশ উপায়:
~$ x="/foo/bar/fizzbuzz.bar.quux.zoom";
~$ y=${x/\/*\//};
~$ echo ${y/.*/};
fizzbuzz
এই কার্যকারিতাটি "প্যারামিটার সম্প্রসারণ" এর অধীনে ম্যান ব্যাশে ব্যাখ্যা করা হয়েছে। অ-বাশ পদ্ধতিতে প্রচুর পরিমাণে: ওকেড, পার্ল, সেড এবং আরও।
সম্পাদনা করুন: ফাইলের মধ্যে বিন্দু সাথে কাজ করে প্রত্যয় ও প্রত্যয় (এক্সটেনশন) জানতে হবে না, কিন্তু না এ বিন্দু সঙ্গে কাজ নাম নিজেই।
বেসনেম এবং ডেরনাম ফাংশনগুলি আপনার পরে যা রয়েছে:
mystring=/foo/fizzbuzz.bar
echo basename: $(basename "${mystring}")
echo basename + remove .bar: $(basename "${mystring}" .bar)
echo dirname: $(dirname "${mystring}")
আউটপুট রয়েছে:
basename: fizzbuzz.bar
basename + remove .bar: fizzbuzz
dirname: /foo
mystring=$1
বদলে বর্তমান ধ্রুবক রয়েছে যার মান (যা একাধিকবার সতর্ক দমন করবে স্পেস / উল্লিখিত glob অক্ষর / ইত্যাদি ধারণ করে না নির্দিষ্ট হচ্ছে), এবং ঠিকানা বিষয় এটা খুঁজে বের করে?
echo "basename: $(basename "$mystring")"
- mystring='/foo/*'
আপনি যদি *
বর্তমান ডিরেক্টরিতে ফাইলগুলির একটি তালিকা সমাপ্তির পরে প্রতিস্থাপন না করেন তবে এইভাবে basename
।
basename
অনুমান করে ব্যবহার করে যে আপনি ফাইল এক্সটেনশন কি জানেন, তাই না?
এবং আমি বিশ্বাস করি যে বিভিন্ন নিয়মিত প্রকাশের পরামর্শগুলি একের অধিক "" ফাইলের নামের সাথে মান দেয় না। "
নিম্নলিখিতগুলি ডাবল ডটগুলি সহ্য করতে পারে বলে মনে হচ্ছে। ওহ, এবং ফাইলের নামগুলি যাতে একটি "/" থাকে (কেবল কিকের জন্য)
পাসক্যালকে প্যারাফ্রেস করতে, "দুঃখিত এই স্ক্রিপ্টটি এত দীর্ঘ।
#!/usr/bin/perl
$fullname = $ARGV[0];
($path,$name) = $fullname =~ /^(.*[^\\]\/)*(.*)$/;
($basename,$extension) = $name =~ /^(.*)(\.[^.]*)$/;
print $basename . "\n";
এই উত্তরে ব্যবহৃত পসিক্স কনফর্মেন্ট সিনট্যাক্স ছাড়াও ,
basename string [suffix]
হিসাবে হিসাবে
basename /foo/fizzbuzz.bar .bar
জিএনইউbasename
আরও একটি বাক্য গঠন সমর্থন করে:
basename -s .bar /foo/fizzbuzz.bar
একই ফলাফল সঙ্গে। পার্থক্য এবং সুবিধাটি -s
বোঝায় যে -a
একাধিক যুক্তি সমর্থন করে:
$ basename -s .bar /foo/fizzbuzz.bar /baz/foobar.bar
fizzbuzz
foobar
-z
অপশনটি ব্যবহার করে NUL বাইটের সাহায্যে আউটপুট আলাদা করে এটিকে ফাইলের নাম-সুরক্ষিত করা যায় , উদাহরণস্বরূপ, এই ফাইলগুলির মধ্যে ফাঁকা, নিউলাইনস এবং গ্লোব অক্ষর রয়েছে (এর দ্বারা উদ্ধৃত ls
):
$ ls has*
'has'$'\n''newline.bar' 'has space.bar' 'has*.bar'
একটি অ্যারেতে পড়া:
$ readarray -d $'\0' arr < <(basename -zs .bar has*)
$ declare -p arr
declare -a arr=([0]=$'has\nnewline' [1]="has space" [2]="has*")
readarray -d
4.4 বা আরও বাশ প্রয়োজন। পুরানো সংস্করণগুলির জন্য, আমাদের লুপ করতে হবে:
while IFS= read -r -d '' fname; do arr+=("$fname"); done < <(basename -zs .bar has*)
আপনি যদি অন্যান্য পোস্টে প্রস্তাবিত বেসনাম ব্যবহার করতে না পারেন তবে আপনি সর্বদা সেড ব্যবহার করতে পারেন। এখানে একটি (কুরুচিপূর্ণ) উদাহরণ। এটি সর্বাধিক নয়, তবে এটি পছন্দসই স্ট্রিংটি বের করে এবং ইনপুটটিকে ওয়ান্ট স্ট্রিংয়ের সাথে প্রতিস্থাপন করে কাজ করে।
echo '/foo/fizzbuzz.bar' | sed 's|.*\/\([^\.]*\)\(\..*\)$|\1|g'
যা আপনাকে আউটপুট দেবে
fizzbuzz
প্রস্তাবিত পার্ল সমাধান থেকে সাবধান থাকুন: এটি প্রথম বিন্দুর পরে কোনও কিছু সরিয়ে দেয়।
$ echo some.file.with.dots | perl -pe 's/\..*$//;s{^.*/}{}'
some
আপনি যদি পার্ল দিয়ে এটি করতে চান তবে এটি কাজ করে:
$ echo some.file.with.dots | perl -pe 's/(.*)\..*$/$1/;s{^.*/}{}'
some.file.with
তবে আপনি যদি ব্যাশ ব্যবহার করছেন তবে এর সমাধানগুলি y=${x%.*}
(বা basename "$x" .ext
আপনি যদি এক্সটেনশনটি জানেন তবে) অনেক সহজ।
বেসনেম এটি করে, পথ সরিয়ে দেয়। এটি দেওয়া হলে প্রত্যয়টিও মুছে ফেলা হবে এবং যদি এটি ফাইলের প্রত্যয়টির সাথে মেলে তবে আপনাকে আদেশটি দেওয়ার জন্য প্রত্যয়টি জানতে হবে। অন্যথায় আপনি এমভি ব্যবহার করতে পারেন এবং নতুন নামটি অন্য কোনও উপায়ে কী হওয়া উচিত তা নির্ধারণ করতে পারেন।
পুরো পাথ ছাড়াই ফাইলের নাম পেতে দ্বিতীয়-শীর্ষ-রেট করা উত্তরের সাথে শীর্ষ-রেট করা উত্তরের সংমিশ্রণ:
$ x="/foo/fizzbuzz.bar.quux"
$ y=(`basename ${x%%.*}`)
$ echo $y
fizzbuzz
${parameter%word}
এবং${parameter%%word}
অংশ ম্যাচিং অধ্যায় trailing হবে।