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


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.