আমার স্ক্রিপ্টে আমার যে ফাইলটি নিয়ে কাজ করছি তার ডিরেক্টরি প্রয়োজন । উদাহরণস্বরূপ, ফাইল = "স্টাফ / ব্যাকআপ / ফাইল.জিপ" । ভেরিয়েবল থেকে স্ট্রিং " স্টাফ / ব্যাকআপ / " পাওয়ার জন্য আমার একটি উপায় দরকার $file
।
আমার স্ক্রিপ্টে আমার যে ফাইলটি নিয়ে কাজ করছি তার ডিরেক্টরি প্রয়োজন । উদাহরণস্বরূপ, ফাইল = "স্টাফ / ব্যাকআপ / ফাইল.জিপ" । ভেরিয়েবল থেকে স্ট্রিং " স্টাফ / ব্যাকআপ / " পাওয়ার জন্য আমার একটি উপায় দরকার $file
।
উত্তর:
dirname $file
আপনি যা খুঁজছেন তা
dirname "$file"
বরং। উদ্ধৃতি ব্যতীত ফাইল বা ডিরেক্টরিটির নামের ফাঁকা থাকলে এটি দুর্ব্যবহার করবে।
dirname $file
আউটপুট হবে
stuff/backup
যা এর বিপরীত basename
:
basename $file
আউটপুট হবে
file.zip
${file%/*}
আপনি বাহ্যিক কমান্ডের উপর নির্ভর করবেন না বলে উরভিন / লুফফাইয়ের প্রস্তাবিত মত ব্যবহার প্রযুক্তিগত দিক থেকে আরও ভাল। বেসনামটি একইভাবে পেতে আপনি করতে পারেন ${file##*/}
। আপনার প্রয়োজন না হলে বাহ্যিক কমান্ড ব্যবহার করা অপ্রয়োজনীয়।
file="/stuff/backup/file.zip"
filename=${1##*/} # file.zip
directory=${1%/*} # /stuff/backup
এটি পুরোপুরি এইভাবে পসিক্স মেনে চলবে। আশা করি এটা সাহায্য করবে! :-)
dirname
(আরও দক্ষ) উপর একটি সুবিধা রয়েছে বিল্ট-ইন পদ্ধতির, এবং যে যদি আপনি নির্দিষ্ট হয় না আপনার পাথ সম্পূর্ণরূপে যোগ্যতাসম্পন্ন দিয়ে শুরু হয়। আপনি যদি file=file.zip
, dirname "$file"
ফিরে আসবে .
, যেহেতু ${file%/*}
ফিরে আসবে file.zip
।
case $file in */*) dir=${file%/*};; *) dir=.;; esac
এখনও POSIX-y এবং সমস্যাটি সম্বোধন করে।
সহজভাবে ব্যবহার $ dirname /home/~username/stuff/backup/file.zip
এটি ফিরে আসবে /home/~username/stuff/backup/
dirname $file