একটি ফাইলের জন্য প্যারেন্ট ডিরেক্টরি পান


24

আমি কোনও ফাইলের জন্য পিতামাতার ডিরেক্টরিটির নাম পেতে চাই।

উদাহরণ: যখন আমার আছে path=/a/b/c/d/file, আমি আউটপুট হিসাবে কেবল dএবং না /a/b/c/d(যা থেকে পাই dirname $path) চাই ।

এটি করার জন্য কি কোনও অত্যাধুনিক উপায় আছে?

উত্তর:


26

এটা তোলে শোনাচ্ছে মত basename চান এর dirname:

$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d

আমি কেন পাচ্ছি পরিবর্তে ডেবিয়ান নেভিগেশন অভিভাবক ডিরেক্টরি?
— আমির

@ আমির: আপনি কি পুরো পথ, বা কেবল একটি ফাইল নাম দিয়ে শুরু করছেন? যদি এটি কেবল একটি ফাইলের নাম হয় তবে dirnameকমান্ডটি এটি বর্তমান ডিরেক্টরিতে (ওরফে "।") ধরে নেবে।
— গর্ডন ডেভিসন

ভাল, আমি এটি ব্যবহার করছি:parentname="$(basename "$(dirname "$pwd")")"
— আমির

1
@ আমির: শেল ভেরিয়েবলগুলি সংবেদনশীল এবং PWDএটিকে অবশ্যই মূলধন করতে হবে। ব্যবহার করে দেখুন parentname="$(basename "$(dirname "$PWD")")"।
— গর্ডন ডেভিসন

5

আপনি বর্তমান ওয়ার্কিং ডিরেক্টরিটি পেতে পিডাব্লুডিকে ব্যবহার করতে পারেন এবং এটি অন্য (উপ) শেলটিতে ফোরকিং এড়ানোর জন্য প্যারামিটার সম্প্রসারণ ব্যবহার করতে পারেন ।

echo ${PWD##*/}

সম্পাদনা: প্রমাণিত উত্স


বর্তমান ডিরেক্টরিটি নিয়ে প্রশ্নটির কোনও যোগসূত্র নেই। আপনি ব্যবহার করতে পারেন${path##*/}
— ম্যাটিও

2

আমি মনে করি এটি একটি কম-সংস্থান সমাধান:

 $ filepath=/a/b/c/d/file
 $ echo ${${filepath%/*}##*/}
 d

সম্পাদনা: দুঃখিত, বাশে নেস্টেড সম্প্রসারণ সম্ভব নয় তবে এটি zsh এ কাজ করে। ব্যাশ-সংস্করণ:

 $ filepath=/a/b/c/d/file
 $ path=${filepath%/*}
 $ echo ${path##*/}
 d

এমন কয়েকটি প্রান্তের কেস রয়েছে যা এটি ভালভাবে পরিচালনা করে না, মূলত যখন সম্পূর্ণ মাল্টিলেভেল পাথ না থাকে। উদাহরণস্বরূপ, filepath=fileবা ফাইলপথ = / ফাইল` দিয়ে এটি ব্যবহার করে দেখুন `
— গর্ডন ডেভিসন

প্রকৃতপক্ষে. কিন্তু এর পিতামহিত ডিরেক্টরি কি foofile? যদি এটি পুরো পাথ না হয় তা জানতে না পারে (যদি foofileবিদ্যমান ফাইলটি কেবল একটি "স্ট্রিং" নাও হয়)।
— উজসোল্ট

1

ব্যাশে, এক লাইনে:

$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'

2
আপনি কি দয়া করে জড়িত পদ্ধতিগুলি বিস্তারিতভাবে বর্ণনা করতে পারেন? এটি ভবিষ্যতের পাঠকদের জন্য সহায়ক হতে পারে। এছাড়াও, দয়া করে 1/2 লাইনের উত্তর না লেখার চেষ্টা করুন।
— লরেঞ্জো ভন ম্যাটারহর্ন

0

আমি জুলিয়ান 67 এর উত্তরটি সর্বোপরি পছন্দ করি তবে এখানে কিছুটা প্রসারিত সংস্করণ রয়েছে:

file_path = "a/b/c/d/file.txt"
parent=$(echo $file_path | sed -e 's;\/[^/]*$;;') # cut away "/file.txt";'$' is end of string
parent=$(echo $parent | sed -e 's;.*\/;;')  # cut away "/a/b/c/"
echo $parent # --> you get "d"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.