বাশ ডিরেক্টরি শর্টকাটগুলি


28

আমি যখন টাইপ করি cd ~foo, আমি বাশ চাই যে আমাকে fooসম্পূর্ণ ডিরেক্টরি পাথ টাইপ করার শর্টকাট হিসাবে কিছু ডিরেক্টরিতে নিয়ে যাবে foo। এবং আমি ডিরেক্টরি থেকে হোম ডিরেক্টরিতে cp ~foo/bar.txt ~/bar.txtকোনও ফাইল অনুলিপি করতে সক্ষম হতে চাই /foo/... সুতরাং মূলত, আমি এমন কিছু চাই যা ঠিক যেমন কাজ ~/করে তবে আমি ডিরেক্টরিটি কী হওয়া উচিত তা উল্লেখ করি। [আমি নিশ্চিত যে আমার জেফজি করা উচিত, তবে আমি কী জানি এফজি করতে হবে]


zsh এর জন্য অন্তর্নির্মিত সমর্থন করেছে। এটিকে " নামযুক্ত ডিরেক্টরিগুলি " বলা হয়
সিলডোরথ

আমি খুব দীর্ঘ সময় ধরে কিছু শেল-বুকমার্কিং সরঞ্জামের সন্ধান করছিলাম এবং অবশেষে আমি আমার নিজের (अस्पष्ट-অনুসন্ধান-ভিত্তিক) সমাধানটি শেষ করেছিলাম যা আমি এর আগে আরও কিছু দেখতে পেয়েছি like এই উত্তরটি দেখুন: unix.stackexchange.com/a/209892/46011
দিমিত্রি ফ্রাঙ্ক

উত্তর:


39

আমি এটি করার উপায়টি হ'ল একটি ডিরেক্টরি তৈরি করা যাতে আপনি শর্টকাটগুলি করতে চান এমন ডিরেক্টরিগুলির সাথে সিমলিংক রয়েছে এবং আপনার ডিরেক্টরিটি আপনার সিডিপ্যাথে যুক্ত করুন। cdআপনি ডিরেক্টরিগুলি স্যুইচ করার সময় CDPATH নিয়ন্ত্রণ করবে যেখানে সিমলিংকের ডিরেক্টরিটি যদি আপনার সিডিপ্যাথে থাকে তবে আপনি তাত্ক্ষণিক সিমলিংকড cdডিরেক্টরিতে যেতে পারেন:

mkdir ~/symlinks
ln -s /usr/bin ~/symlinks/b
export CDPATH=~/symlinks
cd b   # Switches to /usr/bin

খারাপ দিকটি হ'ল এটি যদি আপনার বর্তমান ডিরেক্টরিতে "বি" নামে একটি ডিরেক্টরি থাকে তবে এটি কাজ করবে না - যা সিডিপ্যাথের চেয়ে বেশি অগ্রাধিকার গ্রহণ করে


আমি সাধারণত উত্তরগুলি অপছন্দ করি যা বলে যে "প্রথমে আপনাকে শেলগুলি স্যুইচ করা দরকার", তবে এই সঠিক বৈশিষ্ট্যটি জেডএসএইচে উপস্থিত রয়েছে , আপনি যদি পরিবর্তে এটি ব্যবহার করতে চান তবে; একে নামকৃত ডিরেক্টরি বলে । আপনি একটি পরিবর্তনশীল রফতানি করেন fooএবং আপনি ~fooএটি উল্লেখ করলে এর মানটি সমাধান হয় $foo। এটি বিশেষত সুবিধাজনক কারণ এটি কমান্ডগুলিতেও কাজ করে cd:

echo hi > /tmp/test
export t=/tmp
cat ~t/test   # Outputs "hi"

2
কীভাবে এই জেডএসএইচ বৈশিষ্ট্যটি করা থেকে পৃথক: ইকো হাই> / টিএমপি / পরীক্ষা; এক্সপোর্ট টি = / টিএমপি; বিড়াল $ t / পরীক্ষা অন্তত আমার মেশিনে, এটি ঠিক কাজ করে। পার্থক্য হ'ল আপনার যে চরিত্রটি টাইপ করতে হবে is
স্টিভেন ডি

অপটিকে Zsh এ উল্লেখ করা সঠিক কাজ। আমি 15 বছর একবারে এই বৈশিষ্ট্যটি মিস করি না। দেখে মনে হচ্ছে কিছু ধরণের জিনিসটি সত্যই কিছুটা মানুষ আচ্ছন্ন হয়ে পড়ে অন্যদের যত্ন নেয় না। একাধিক শেল আছে কেন

2
@Steven এটি বেশ অনুরূপ, কিন্তু ZSH জানে এই ক্ষেত্রে একটি নামাঙ্কিত ডিরেক্টরির তাই এটা প্রম্পট প্রসারণও মধ্যে বিশেষভাবে আচরণ এবং শেল করতে বিল্ট-ইন কমান্ড
মাইকেল Mrozek

[আমি বেশিরভাগই ইমাস এমএক্স শেল ব্যবহার করে এটি করছিলাম (যেহেতু আমি যখন টার্মিনালটি ব্যবহার করি), আমি অনুমান করি যে জেডএসএইচ সমাধানগুলি বাতিল করে দিয়েছে] ...
সিউমাস

1
এটি আমার .zshrc এ যুক্ত করেছে এবং এটি কাজ করেছে।
Seamus

10

আপনি এর জন্য একটি মোড়ক ফাংশন লিখতে cdএবং এটি "সিডি" কল করতে পারেন (শেষ পর্যন্ত ফাংশনটি কল করবে builtin cd- builtinকীওয়ার্ডটি ব্যবহার করে )। আপনি একটি উপসর্গের অক্ষর ব্যবহার করতে পারেন যা আপনার কার্যটি দেখার আগে কমান্ড লাইনে বাশ প্রসারিত হবে না এবং সম্ভবত আপনার ডিরেক্টরিতে ":" নামের প্রাথমিক অক্ষর হিসাবে উপস্থিত হওয়ার সম্ভাবনা নেই। আপনি এটিকে আরও দৃ to় করতে চাইবেন তবে এখানে একটি সরল রূপরেখা:

# format: [semicolon] shortcut colon destination [semicolon] ...
export CDDATA='foo:/path/to/foo;bar:/path/to/bar;baz:/path/to/baz'

cd () {
    local dest=$1
    if [[ $dest == :* ]]
    then
        [[ $CDDATA =~ (^|;)${dest:1}:([^;]*)(;|$) ]]
        dest=${BASH_REMATCH[2]}
    fi
    if [[ -z $dest ]]
    then
        cd
    else
        builtin cd "$dest"
    fi
}

cd :bar    # pwd is now /path/to/bar

1
এটি সত্যিই ভাল ধারণা
মাইকেল মরোজেক

এই পরামর্শের জন্য ধন্যবাদ - এটির উপরে আমার সত্যিকারের সহজ সমাধান তৈরি করেছেন: aaverin.github.io/unix/macox/2014/05/26/bash-
নাম-

7

বাশ সহ:

~fooব্যবহারকারী foo এর হোম ডিরেক্টরি জন্য সংরক্ষিত। আমি কেবল সেই সুবিধার্থে ব্যবহারকারী তৈরি করার পরামর্শ দেব না।

পরিবেশ পরিবর্তনশীল সেট করে ডিরেক্টরি পরিবর্তন করার সময় আপনি নিজের জীবনকে (বা আরও শক্ত) করতে পারেন CDPATH(এটি সন্ধান করুন bash(1))।

তা বাদে, ভাবতে হবে একমাত্র উপায় হ'ল আপনি যে ডিরেক্টরিগুলি সংক্ষিপ্ত করতে চান তাদের জন্য পরিবেশের ভেরিয়েবল সেট করা।

$ FOODIR=/var/lib/misc
$ cp ~/bar.txt $FOODIR

2

বুক ভেরিয়েবলগুলি বুকমার্কিং সিস্টেম তৈরি করতে ব্যবহার করা যেতে পারে। ভেরিয়েবলগুলি যে কোনও কমান্ডের সাথে কাজ করবে এবং ব্যাশটি চলক নামটি সম্পূর্ণ করবে। ব্যাশের নতুন সংস্করণগুলিতে, যদি / চলক নামের সাথে যুক্ত করা হয় তবে চলকটির যে পথটি রয়েছে তা ট্যাবটিও সম্পন্ন হতে পারে।

mydir=/home/chris/dir
ls $my         # Tab completion works on variable name.
ls $mydir/     # Tab completion is equivalent to that with ls /home/chris/dir/
               # (doesn't work in older versions of bash).

অধ্যবসায়ের জন্য, পরিবর্তনশীল ঘোষণাগুলি একটি ফাইলের মধ্যে রাখা যেতে পারে যা .bashrc থেকে উত্পন্ন হয়। যেহেতু এই ফাইলটি ব্যাশ স্ক্রিপ্ট, তাই এটিতে এমন ঘোষণাগুলি থাকতে পারে যা অন্যান্য ভেরিয়েবলগুলি উল্লেখ করে aur="${HOME}/AUR", বা কেবলমাত্র কয়েকটি হোস্টে চালিত হয় if [[ $HOSTNAME == foo ]]; then bar=baz; fi, এটি দরকারী যদি আপনি একাধিক হোস্ট এবং ব্যবহারকারীদের মধ্যে কনফিগারেশন ফাইলগুলি পুনরায় ব্যবহার করেন।

নিম্নলিখিত বাশ ফাংশন (.bashrc এ যোগ করা বা এটি থেকে উত্সাহিত) বুকমার্কগুলিকে বুকমার্ক ফাইল থেকে যুক্ত এবং সরানোর অনুমতি দেয়। এটি মোটামুটি নতুন এবং ত্রুটিমুক্ত থাকার নিশ্চয়তা নেই।

bookmark_file=~/.bookmarks
source "$bookmark_file"

bm() {
usage='Usage:
bm add <name> <path>           Create a bookmark for path.
bm add <name>                  Create a bookmark for the current directory.
bm update                      Source the bookmark file.
bm remove <name>               Remove a bookmark'              

case $1 in
    add)
        local path
        if [[ $# -eq 2 ]]; then
            path=.
        elif [[ $# -eq 3 ]]; then
            if [[ -e $3 ]]; then
                path="$3"
            else
                echo "bm: ${3}: No such file or directory."
                return 1
            fi               
        else
            echo "$usage"
            return 1
        fi

        if declare | grep "^${2}=" > /dev/null; then
            echo "bm: The name $2 is in use."
            return 1
        fi
        path=$(readlink -f "$path")
        echo ${2}=\""$path"\" >> "$bookmark_file"
        eval ${2}=\""$path"\"
        return 0
        ;;
    update)
        if [[ $# -eq 1 ]]; then
            source "$bookmark_file"
            return 0
        fi
        ;;
    remove)
        if [[ $# -eq 2 ]]; then
            unset $2
            local contents=$(grep -v "^${2}=" "$bookmark_file")
            echo "$contents" > "${bookmark_file}.tmp"
            rm -f "$bookmark_file"
            mv "${bookmark_file}.tmp" "$bookmark_file"
            return 0
        fi
        ;;
esac

echo "$usage"
return 1
}

0

একটি উপায়ে সিডির জন্য একটি উপকরণ তৈরি করা হবে যা ~cচেয়েছিল পথে প্রতিস্থাপন করবে। অথবা কেবল zsh ব্যবহার করুন)


2
হ্যাঁ, আমি এটি সম্পর্কে thought সি = "সিডি / ডেটন / সিভিএস / প্লাগইন_রোট" এর মতো করার কথা ভেবেছিলাম তবে এটি কেবল সিডি সাহায্য করে, যখন নামক ডিরেক্টরিগুলি প্রতিটি কমান্ডের সাহায্যে ব্যবহার করা যেতে পারে।
fschmitt

0

ডিরেক্টরি পরিবর্তন করার জন্য, আপনি ডাব্লুসিডি ব্যবহার করতে পারেন: যেখানেই পরিবর্তন ডিরেক্টরি

এই যে, এটি হবে wcd plugin_root


আমি যে কমান্ড সাথে কাজে ছাড়া অন্য কিছু চেয়েছিলেন cdপাশাপাশি ...
সিমাস

0

আমার নীচের ফাংশনটি রয়েছে যা উড়ে উড়ে তৈরি করবে,

s () {
    if [[ "x$1" != "x" ]]
    then
        alias $1="cd $PWD;pwd"
        echo "alias $1=\"cd $PWD;pwd\""
    else
        echo "Usage: s[s] <directory bookmark name>"
        return 1
    fi
}

যখন আমি একটি ডিরেক্টরি বুকমার্ক করতে চাই, আমি কেবল টাইপ করি s dirName। এটি একটি উপনামের মতো তৈরি করে alias dirName="cd /my/current/directory/;pwd"। সুতরাং আমি কেবল টাইপ করে এই ডিরেক্টরিতে ফিরে আসতে পারি dirName। আমার কাছে একটি সংস্করণ রয়েছে যা এটিকে বাশ_লিয়াসগুলিতেও সংরক্ষণ করে। এটি যে কোনও শেলের মধ্যে কাজ করে।

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