নির্দিষ্ট ফোল্ডারে অবধি সিডি আপ করুন


16

আমি ম্যাজেন্টোতে প্রচুর কাজ করি এবং তাই আমি যাদের সাথে কাজ করি তাদের প্রচুর কাজ করি এবং এটি টাইপ করতে বিরক্ত হয়:

সিডি ../../../../..////

কেবলমাত্র আপনার রুট 'httpdocs' ফোল্ডার থেকে আপনি এখনও কয়েকটি ডিরেক্টরি সন্ধানের জন্য, তাই আমি এই সিউডো-কোড অনুসরণ করে একটি স্ক্রিপ্ট তৈরি করার চেষ্টা করছি:

while lowest level directory != httpdocs
    cd ../
end while;

বেশ সহজ বলে মনে হচ্ছে, আমি ধরে নিচ্ছি যে চলমান কার্যনির্বাহী ডিরেক্টরিটির শেষ অংশটি httpdocs কিনা তা যাচাই করার জন্য আমাকে কিছু আকারের গ্রাইপ করতে হবে, যদি এটি সত্য না হয় কেবল স্তর পর্যন্ত না চলে।

আমি এটির জন্য বাশ শিখতে দেখছি, যদিও মনে হচ্ছে ইতিমধ্যে এটির মতোই কিছু আছে এবং সিনট্যাক্সটি আমার ধাঁধা শেষ করে না।

উত্তর:


8

এটি একটি শেল ফাংশন হতে হবে , একটি স্ক্রিপ্ট নয়, কারণ একটি স্ক্রিপ্ট একটি নতুন শেলের মধ্যে চালিত হয় (এবং এটি মূল শেলের ডিরেক্টরি পরিবর্তন করতে পারে না)।

function cdroot()
{
  while [[ $PWD != '/' && ${PWD##*/} != 'httpdocs' ]]; do cd ..; done
}

আপনি অবশ্যই ফাংশনটির নাম দিন যা আপনার পছন্দ।

কিছু ব্যাখ্যা: $PWD != '/'আপনি cdrootযখন কোনও httpdocs ফোল্ডারের অভ্যন্তরে না থাকেন তখন প্রথম পরীক্ষা ( ) ব্যর্থ হয় । আপনি যখন মূলে যাবেন তখন এটি থামবে।

দ্বিতীয় পরীক্ষা ( ${PWD##*/} != 'httpdocs') কিছুটা জটিল। $PWDবর্তমান ডিরেক্টরিটির পথ সহ একটি চলক। ${PWD##*/}শেষ স্ল্যাশ পর্যন্ত সবকিছু ছাঁটাই করে।


এই পুনরাবৃত্তির একটির নেতিবাচক দিকটি হ'ল cd -আপনি যেখানে ছিলেন সেখানে ফিরে যাওয়ার জন্য আপনি কেবল তার পরে করার ক্ষমতা হারিয়ে ফেলেন।
ইজাকুয়েল মুন্স

27

uptoআমার .bashrc এ আমার একটি ফাংশন রয়েছে যা আপনাকে বর্তমান পথে যে কোনও ডিরেক্টরিতে নাম হিসাবে যেতে দেয়:

upto ()
{
    if [ -z "$1" ]; then
        return
    fi
    local upto=$1
    cd "${PWD/\/$upto\/*//$upto}"
}

আমার এই ক্রিয়াকলাপটির জন্যও সমাপ্তি রয়েছে, যাতে এটি ট্যাবকে আঘাত করলে এটি আমাকে বৈধ ডিরেক্টরি নাম এবং সম্পূর্ণতা দেয়:

_upto()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    local d=${PWD//\//\ }
    COMPREPLY=( $( compgen -W "$d" -- "$cur" ) )
}
complete -F _upto upto

এছাড়াও, আমার আরও একটি ফাংশন রয়েছে jdযা আমাকে বর্তমানের নীচে যে কোনও ডিরেক্টরিতে ঝাঁপিয়ে পড়তে দেয়:

jd(){
    if [ -z "$1" ]; then
        echo "Usage: jd [directory]";
        return 1
    else
        cd **"/$1"
    fi
}

উদাহরণ:

[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto h[TAB][TAB]
habitat       hippopotamus
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto hippopotamus
[/www/public_html/animals/hippopotamus] $ jd images
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ 

আপনি এর জন্য একটি নামও যুক্ত করতে পারেন upto httpdocs
সিজেএম

@ড্রোগবেন: jdপ্রতিটি ক্ষেত্রেই কাজ করতে দেখা যায় না, কীভাবে এটি কাজ করে তা বোঝাতে আপনার কি আপত্তি হবে?
সিজার

@ সিজার এটি গ্লোবস্টার ( **) ব্যবহার করে । আপনার ব্যাশ শেল ব্যবহারে এই বৈশিষ্ট্যটি সক্ষম করতে shopt -s globstar
ডগবনে

2
এটি এত উজ্জ্বলভাবে করা হয়েছে, আমি আশা করি আমি দু'বার উপচে পড়তে পারব।
18-18 এ ড্রপ

1
আমি jdফাংশনে একটি গতিশীল শপ সনাক্তকরণ এবং অ্যাক্টিভেশন অন্তর্ভুক্ত করেছি , gist.github.com/Rob--W/5888648 দেখুন । আমি কেবল এটি 4.2.45 বাশ দিয়ে পরীক্ষা করেছি, তাই ওয়াইএমএমভি।
রব ডব্লু

5

সবচেয়ে সহজ বাশ ফাংশন যা আপনি নিজের মধ্যে রাখতে পারেন .bashrcযা আমি ভাবতে পারি (সহজ কারণ এটি লুপগুলি বা বাহ্যিক প্রক্রিয়াগুলি ব্যবহার করে না) হ'ল:

cdup() {
    cd "${PWD/\/httpdocs\/*//httpdocs}"
}

এই ব্যবহার প্যাটার্ন প্রতিকল্পন পর সবকিছু প্রতিস্থাপন প্যারামিটার সম্প্রসারণ /httpdocs/মধ্যে$PWD দিয়ে `/ httpdocs '। এটি দেখতে খুব অগোছালো দেখাচ্ছে কারণ ব্যাশ এক্সপেনশন সিনট্যাক্সের ফরোয়ার্ড স্ল্যাশগুলির থেকে তাদের পার্থক্য করার জন্য আমাদের এগিয়ে থাকা স্ল্যাশগুলি এড়াতে হবে। প্লাস প্রতিস্থাপনের স্ট্রিংয়ে ফরোয়ার্ড স্ল্যাশগুলি থেকে রেহাই পাবেন না, সুতরাং এটি অসঙ্গত দেখাচ্ছে।

যদি /httpdocs/বর্তমান পথে কোনও পদক্ষেপ না থাকে তবে কোনও বিকল্পগুলি সম্পাদন করা হবে না এবং এটি কেবল বর্তমান ডিরেক্টরিতে পরিবর্তিত হবে।

উদাহরণস্বরূপ, প্রতিস্থাপনটি সেই ডিরেক্টরিতে এবং এর /a/b/c/httpdocs/e/f/gসাথে প্রতিস্থাপন করবে ।/a/b/c/httpdocscd

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


ঘটনাচক্রে, এটি উল্লেখ করার মতো যে এটি আপনাকে যথাসম্ভব ক্রমবর্ধমান স্তরের উপরে নিয়ে যাবে (এটি সম্ভবত সবচেয়ে কার্যকর ব্যবহারের ক্ষেত্রে) useful
ইব্রাহিম

3

আপনি নিজের প্রোফাইলে এরকম কিছু রাখতে পারেন:

alias cdh='cd $(echo $PWD | sed -e "s/\(.*\/httpdocs\)\/.*/\1/")'

স্রেফ টাইপিং cdhআপনাকে httpdocsআপনার বর্তমান পথে শীর্ষস্থানীয় ডিরেক্টরিতে নিয়ে যাবে।


2

এটি সম্পূর্ণরূপে আপনার সমস্যার সমাধান করে না তবে এটি cd ../../../../../../কিছুটা করা সাশ্রয় করবে । আমি এখানে ব্যবহারকারীর অজানা পোস্ট থেকে ধার নিয়েছি ।


আপ এন

ডিরেক্টরি ট্রিতে লাফ দিন N ডিরেক্টরি

টাইপিংয়ের পরিবর্তে

cd ../../../..

আপনি শুধু টাইপ করুন

up 4

এবং ক

cd -    

তোমাকে ফিরিয়ে আনবে

এটি ব্যবহার করতে আপনার .bashrc এ ফাংশনটি রাখুন।

# (c) 2007 stefan w. GPLv3          
function up {
ups=""
for i in $(seq 1 $1)
do
        ups=$ups"../"
done
cd $ups
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.