ফাইল পাথ থেকে ফাইল ডিরেক্টরি পাথ পান


400

বাশে, যদি VAR="/home/me/mydir/file.c", আমি কীভাবে পাব "/home/me/mydir"?

উত্তর:


646

dirnameএবং basenameযে সরঞ্জামগুলি আপনি পাথের উপাদানগুলি আহরণের জন্য সন্ধান করছেন তা হ'ল:

$ VAR=/home/me/mydir/file.c

$ DIR=$(dirname "${VAR}")

$ echo "${DIR}"
/home/me/mydir

$ basename "${VAR}"
file.c

এগুলি অভ্যন্তরীণ বাশ কমান্ড নয় তবে তারা পসিক্স স্ট্যান্ডার্ডের একটি অংশ (দেখুন dirname, basename) এবং তাই বাশ চলমান প্রচুর সিস্টেমে পাওয়া উচিত।


4
কেন ভেরিয়েবলের চারপাশে বন্ধনীর ব্যবহার, এবং উদাহরণস্বরূপ "$ VAR" নয়?
ব্যবহারকারী 658182

1
stackoverflow.com/questions/8748831/… উপরের প্রশ্নের উত্তর দেয়।
ব্যবহারকারী 658182

1
@ ব্যবহারকারী 658182 এই বিশেষ উদাহরণে এটি অভ্যাসের বাইরে করা হয়, প্রয়োজনীয়তা নয়।
পরিত্যক্ত কার্ট

95
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir

$ echo "${VAR##*/}"
file.c

basenameএবং এর সাথে নির্ভরতা এড়াতেdirname


3
যেহেতু উভয়ই পসিক্সের অংশ তাই নির্ভরতা কোনও সমস্যা হওয়া উচিত নয়।
orkoden

1
অর্কোডেন, আপনি ঠিক বলেছেন আমার উত্তরের লক্ষ্যটি দেখাতে যে দুটি অতিরিক্ত প্রক্রিয়া চালানোর কোনও বাধ্যবাধকতা নেই। ব্যাশ ব্যবহারের ক্ষেত্রে স্বয়ংসম্পূর্ণ।
এমমানুয়েল দেবউক্স

2
আমি ইমানুয়েলের পদ্ধতিটি ব্যবহার করছি কারণ আমি কোনও ফাইল বা ফোল্ডারের নামটি পাস করতে চাই এবং তারপরে ফোল্ডারের পথটি গণনা করতে চাই। এই রেজেক্সটি ব্যবহার করে সঠিক কাজ করা হয়, যখন আমি কোনও ফোল্ডার ইনপুট করি তখন ডায়ারনেম ফাংশনটি প্যারেন্ট ফোল্ডারটি ফিরিয়ে দেয়।
অ্যানি দ্য অ্যাজিল

8
যাইহোক, যদি in VAR তে কোনও পথের তথ্য না থাকে তবে AR / VAR% / *} / পরীক্ষাটি $ VAR / পরীক্ষার সমান একটি অপ্রত্যাশিত মান উৎপন্ন করে যেখানে / (dirname $ VAR) ./est এর আরও অনুমানযোগ্য এবং উপযুক্ত মান উত্পাদন করে। এটি অনেক বড় বিষয় কারণ প্রাক্তন ফাইলনামকে ডিরেক্টরি হিসাবে বিবেচনা করার চেষ্টা করবেন যখন উত্তরটি ঠিক থাকবে।
ডেভেমায়রন

19

সম্পর্কিত নোটে, যদি আপনার কাছে কেবল ফাইলের নাম বা আপেক্ষিক পাথ dirnameথাকে তবে এটি নিজেই সহায়তা করবে না। আমার জন্য, উত্তরটি শেষ হয়ে গেল readlink

fname='txtfile'    
echo $(dirname "$fname")                # output: .
echo $(readlink -f "$fname")            # output: /home/me/work/txtfile

এরপরে আপনি কেবল দুটি ডিরেক্টরি একত্রিত করতে পারেন কেবল ডিরেক্টরি পেতে।

echo $(dirname $(readlink -f "$fname")) # output: /home/me/work

1
যদি একাধিক পাথের উপাদান বিদ্যমান না থাকে তবে আপনার readlink -m "$fname"দেওয়া নামটি পুনরাবৃত্তভাবে ক্যানোনিকালাইজ করতে ব্যবহার করা উচিত
EDkan

7

যদি আপনি লক্ষ্যযুক্ত ফাইলগুলিকে প্রতীকী লিঙ্ক হিসাবে যত্নশীল করেন তবে প্রথমে আপনি এটি পরীক্ষা করে মূল ফাইলটি পেতে পারেন। নীচের আইফোনটি আপনাকে সহায়তা করতে পারে।

if [ -h $file ]
then
 base=$(dirname $(readlink $file))
else
 base=$(dirname $file)
fi

5

আমি এটি নিয়ে খেলছিলাম এবং একটি বিকল্প নিয়ে এসেছি।

$ VAR=/home/me/mydir/file.c

$ DIR=`echo $VAR |xargs dirname`

$ echo $DIR
/home/me/mydir

আমি যে অংশটি পছন্দ করেছি তা হ'ল গাছটিকে ব্যাকআপ করা সহজ ছিল:

$ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname`

$ echo $DIR
/home

1

এখানে পুনরাবৃত্তাকার ট্রিমিংয়ের জন্য আমি একটি স্ক্রিপ্ট ব্যবহার করেছি। অবশ্যই আপনি চান ডিরেক্টরিটি দিয়ে $ 1 প্রতিস্থাপন করুন।

BASEDIR="$1"
IFS=$'\n'
cd $BASEDIR
 for f in $(find . -type f -name ' *')
 do 
    DIR=$(dirname "$f")
    DIR=${DIR:1}
    cd $BASEDIR$DIR
    rename 's/^ *//' *
 done

0

প্রথমত, আমি /খালি স্থান ( ) দিয়ে প্রতিস্থাপন করেছি । তারপরে, আমি কোনও খালি জায়গার আগে সমস্ত অক্ষর মুছে ফেলেছি । শেষে, আমি প্রথম অক্ষরটি সরিয়ে ফেললাম যা খালি স্থান ( )।

$ VAR="/home/me/mydir/file.c"

$ echo $VAR | tr '/' ' ' | sed 's/^.* / /' | cut -c2-
file.c

0
HERE=$(cd $(dirname $BASH_SOURCE) && pwd)

যেখানে আপনি নতুন_পথ = সহ পুরো পথ পাবেন $(dirname ${BASH_SOURCE[0]})। আপনি cd নতুন_পথ দিয়ে বর্তমান ডিরেক্টরিটি পরিবর্তন করেন এবং তারপরে pwdবর্তমান ডিরেক্টরিটির পুরো পথটি পেতে চালনা করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.