কীভাবে `সিডি দির / ফাইল নাম` আমাকে ডিয়ার / এ নিতে পারেন?


10

আমি cdএকটি ফাইল আর্গুমেন্ট সঙ্গে ব্যবহার করতে সক্ষম হতে খুব সুবিধাজনক মনে হবে ।

cd myDirectory/anyname.anyExtension সমান হবে cd myDirectory/

এই আচরণটি অর্জন করার জন্য সর্বোত্তম উপন্যাস বা ফাংশনটি কী হবে?

সম্পাদনা : দুঃখিত আমি 1 ম স্থানে এটি উল্লেখ করিনি: আমি ব্যবহার করিzsh

উত্তর:


5

ইন zsh, আমি প্রায়শই করি:

cd /path/to/somefile(:h)

( hজন্য head)

যদি somefileএকটি সিমিলিংক হয় তবে আপনি এটিও করতে পারেন:

cd somefile(:A:h)

যে ডিরেক্টরিটিতে সিমিলিংকের লক্ষ্য পাওয়া যায় সেখানে যেতে।


zshক্রিস সমতুল্য 'এখন bash-only সমাধান হতে হবে:

cd() {
  [[ ! -e $argv[-1] ]] || [[ -d $argv[-1] ]] || argv[-1]=${argv[-1]%/*}
  builtin cd "$@"
}

ইন zsh, আপনি "শব্দ" কী Ctrl-Wসরিয়ে দেয় তা পুনরায় সংজ্ঞায়িত করতে পারেন ।

ইন zsh, শব্দ-ভিত্তিক গতি / ট্রান্সপোজ / ডিলিট উইজেটের প্রসঙ্গে "শব্দ" হ'ল $WORDCHARSভেরিয়েবলের অক্ষরের ক্রম যা ডিফল্টরূপে অন্তর্ভুক্ত থাকে /

আপনি ভাগ পারে /থেকে $WORDCHARSযাতে Ctrl-Wশুধুমাত্র এক পথ উপাদান মুছে ফেলে:

WORDCHARS=${WORDCHARS/\/}

আর একটি দরকারী এক্সটেনশন হ'ল select-word-styleউইজেট যা আপনি বিভিন্ন শব্দ শৈলীর মধ্যে ইন্টারেক্টিভভাবে চয়ন করতে ব্যবহার করতে পারেন।

autoload select-word-style
zle -N select-word-style
bindkey '\ew' select-word-style

তারপরে চাপ দেওয়া Alt-Wআপনাকে বিভিন্ন শৈলীর শৈলীর মধ্যে চয়ন করতে দেয়।

$ cd /blah/blih<Alt-W>
Word styles (hit return for more detail):
(b)ash (n)ormal (s)hell (w)hitespace (d)efault (q)uit
(B), (N), (S), (W) as above with subword matching
?

মজাদার. (আমি zsh ব্যবহার করি)।
সাবস্টিয়ান

zshশব্দ এবং শৈলীর শক্তি সম্পর্কে খুব আকর্ষণীয় সম্পাদনা । zshকমান্ডের জন্য আপনাকেও ধন্যবাদ । এটি পুরোপুরি কাজ করে।
সাবস্টিয়ান

16

আমি ধরে নিই যে আপনি যদি কোনও ডিরেক্টরি ইনপুট করেন এবং আপনি ব্যবহার করছেন তবে আপনি এখনও মূল কার্যকারিতা ধরে রাখতে চান bash

cd() {
    local file="${!#}"

    if (( "$#" )) && ! [[ -d "$file" ]]; then
        builtin cd "${@:1:($#-1)}" "${file%/*}"
    else
        builtin cd "$@"
    fi
}

আপনি যদি কখনও সিডির বিকল্পগুলি ( -Pইত্যাদি) ব্যবহার না করেন তবে এটিও যথেষ্ট হবে:

cd() { 
    if [ -d "$1" ] || [ -z "$1" ]; then
        builtin cd "$@"
    else
        builtin cd "${1%/*}"
    fi
}

4
যদি আপনি ফাংশনটির নাম সিডিতে পরিবর্তন করেন builtinতবে cdকলগুলির সামনে যোগ করার বিষয়ে নিশ্চিত হন
উলরিচ ড্যাঙ্গেল

@Chris; ধন্যবাদ ফাংশন ব্যবহার করার জন্য এই প্রস্তুত জন্য) আপনি ঠিক অধিকৃত
সেবাস্টিয়ান

cdবিকল্পগুলি সংরক্ষণ করে এমন সংস্করণটি কাজ করে না zsh। সবচেয়ে সহজ যার সাথে কাজ করে zsh, তবে BUT cdআর সমতুল্য নয় cd ~: /
সাবস্টিয়ান

@ সেবাস্তিয়ান এখন চেষ্টা করুন, আমি মনে করি এটি ঠিক করা উচিত।
ক্রিস ডাউন

@ ক্রিস, প্রকৃতপক্ষে একটি চেক যোগ [ -z "$1" ]করা যথেষ্ট ছিল। এটি আরও দৃশ্যমানতা দেওয়ার জন্য আমি স্টিফেনের জবাব গ্রহণ করেছি, কারণ এটি এর সেরা সমাধান বলে মনে হচ্ছে zsh
সাবস্টিয়ান

7

আপনি dirnameপথ থেকে ফাইলের নামটি ছাঁটাতে ব্যবহার করতে পারেন , যেমন

mycd() { cd "$(dirname "$1")"; }

দেখুন man dirname


3
মনে রাখবেন যে আপনি যদি কোনও ডিরেক্টরি ইনপুট করেন তবে এটি সেই ডিরেক্টরিটির উপরে থাকা ডিরেক্টরিতে পরিবর্তিত হবে , যা পছন্দসই নয় (এটি পছন্দসই কিনা তা প্রশ্ন থেকে অস্পষ্ট)।
ক্রিস ডাউন

1
@ ক্রিসডাউন সত্য, তবে আমি পাঠককে অনুশীলন হিসাবে ছেড়ে দিয়েছি এবং আপনার উত্তর কীভাবে এটি মোকাবেলা করতে পারে তা দেখায়।
অ্যাড্রিয়ান ফ্রাথর্থম

1
@ অ্যাড্রিয়ানফ্রাহর্থ একটি অনুশীলন! Hah!

3

আপনি যদি .profileএটিতে আপনার যোগ করেন , তবে এটি লোড করুন ( source ~/.profileবা লগ আউট এবং আবার লগ ইন করুন), তারপরে mycd [file or directory]আপনাকে সঠিক ডিরেক্টরিতে নিয়ে যাবে:

mycd() { if [ -d "$1" ]; then cd "$1"; else cd "$( dirname "$1" )"; fi ; }

যদি আপনি এটির নাম cdরাখেন, তবে অদ্ভুত জিনিসগুলি ঘটবে।


1
ডিরেক্টরি নামটিতে যদি সাদা স্থান থাকে এবং কমান্ড গোষ্ঠীটি সমাপ্ত করতে আপনার একটি ক্লোজিং সেমিকোলন প্রয়োজন হয় তা এটি ভেঙে যাবে। এটি আপনার জন্য সম্পাদিত, আশা করি আপনি আপত্তি করবেন না।
ক্রিস ডাউন

@ ক্রিসডাউন, যদিও এটি অন্যান্য শাঁসের মতো সত্য, আপনার কাছে ক্লোজিং সেমিকোলনের দরকার নেই zsh
স্টাফেন চেজেলাস

এছাড়াও, এটির cdমতো ব্রেকগুলি যদি পাস করতে থাকে তবে পছন্দ করুন -P
ক্রিস ডাউন

0
cd2() {
 arg=() dir= cmd= IFS=" " msg='[-L|[-P [-e]]|-h] [dir|file]'

 while [ "$#" -gt 1 ] ; do
  case "$1" in
   -h) printf "%s: cd2 %s\n" "$0" "$msg"
    return 1 ;;
   *) arg+=("$1") ;;
  esac
  shift
 done

 [ -f "${1:-}" ] && dir="$(dirname ${1:-})" || dir="${1:A}"
 [ ! -z "$arg" ] && cmd="cd ${arg[@]} $dir" || cmd="cd $dir"

 if ! $cmd 2>/dev/null; then
  printf "%s: cd2 %s\n" "$0" "$msg"
  return 1
 fi
}

একটি ডিরেক্টরি বলা হয়েছে $(sudo reboot), এই ফাংশনটি সিস্টেমটিকে পুনরায় চালু করতে পারে। এছাড়াও, ব্যবহারকারী ব্যবহার করছেন zsh, না bash
কুসালানন্দ

কোনও কমান্ড Give (sudo রিবুট) দিন, এই ফাংশনটি সিস্টেমটিকে পুনরায় বুট করবে। এছাড়াও, +1 আমি প্রথমে 'zsh' লক্ষ্য করিনি - ভাল ধরা।
ecwpz91

না, cd '$(sudo reboot)'ডিরেক্টরি পরিবর্তন করবে, যখন আপনার ফাংশন নামটি মূল্যায়নের চেষ্টা করবে।
কুসালানন্দ

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