আমি কীভাবে পূর্ববর্তী / পরবর্তী ভাইবোন ডিরেক্টরিতে সিডি করতে পারি?


10

আমার প্রায়শই এর মতো একটি প্রকল্প ডিরেক্টরি লেআউট থাকে

project
`-- component-a
|   `-- files...
`-- component-b
|   `-- files...
`-- component-c
    `-- files...

আমি সাধারণত একটি componentডিরেক্টরিতে কাজ করব , কারণ ফাইলগুলি সেখানে। আমি যখন শেলটিতে ফিরে আসি তখন আমার প্রায়শই একটি ভাইবোন ডিরেক্টরিতে চলে যাওয়া প্রয়োজন, বিশেষত যখন আমাকে প্রতিটি উপাদানগুলিতে কয়েকটি অ-স্ক্রিপ্টযোগ্য পরিবর্তন করতে হয়। এই ক্ষেত্রে, আমি এমনকি পূর্ববর্তী ভাইবোন ডিরেক্টরিটি আমি কী কাজ করব তা বা পরের ভাইবোন ডিরেক্টরিটিও যত্নশীল হব না।

আমি কি কোনও আদেশকে সংজ্ঞায়িত করতে পারি prevবা nextএটি cdআমাকে পূর্ববর্তী ডিরেক্টরিতে বা পরবর্তী ডিরেক্টরিতে (বর্ণমালা বা যা কিছু দ্বারা) প্রবেশ করতে পারে? কারণ সারাক্ষণ টাইপ cd ../com<TAB><Arrow keys>করা কিছুটা পুরানো হচ্ছে।

উত্তর:


8

অন্য উত্তর থেকে কমান্ডলাইনফু সমাধানটি ব্যবহার করবেন না : এটি অনিরাপদ এবং অদক্ষ ²² পরিবর্তে, আপনি যদি ব্যবহার করছেন তবে bashকেবল নীচের ফাংশনগুলি ব্যবহার করুন। এগুলিকে অবিরাম করার জন্য এগুলি আপনার নিজের মধ্যে .োকান .bashrc। নোট করুন যে আমি গ্লোব অর্ডারটি ব্যবহার করি কারণ এটি অন্তর্নির্মিত এবং সহজ। সাধারণত উল্লিখিত glob অর্ডার হয় যদিও অধিকাংশ অঞ্চলের ক্ষেত্রে এটি বর্ণানুক্রমিক। আপনি যদি পরবর্তী বা পূর্ববর্তী ডিরেক্টরিতে যেতে না চান তবে আপনি একটি ত্রুটি বার্তা পাবেন। বিশেষত, আপনি যদি ত্রুটিটি দেখতে পাবেন তবে আপনি রুট ডিরেক্টরিতে থাকার সময় nextবা ।prev/

## bash and zsh only!
# functions to cd to the next or previous sibling directory, in glob order

prev () {
    # default to current directory if no previous
    local prevdir="./"
    local cwd=${PWD##*/}
    if [[ -z $cwd ]]; then
        # $PWD must be /
        echo 'No previous directory.' >&2
        return 1
    fi
    for x in ../*/; do
        if [[ ${x#../} == ${cwd}/ ]]; then
            # found cwd
            if [[ $prevdir == ./ ]]; then
                echo 'No previous directory.' >&2
                return 1
            fi
            cd "$prevdir"
            return
        fi
        if [[ -d $x ]]; then
            prevdir=$x
        fi
    done
    # Should never get here.
    echo 'Directory not changed.' >&2
    return 1
}

next () {
    local foundcwd=
    local cwd=${PWD##*/}
    if [[ -z $cwd ]]; then
        # $PWD must be /
        echo 'No next directory.' >&2
        return 1
    fi
    for x in ../*/; do
        if [[ -n $foundcwd ]]; then
            if [[ -d $x ]]; then
                cd "$x"
                return
            fi
        elif [[ ${x#../} == ${cwd}/ ]]; then
            foundcwd=1
        fi
    done
    echo 'No next directory.' >&2
    return 1
}

¹ এটি সমস্ত সম্ভাব্য ডিরেক্টরি নাম হ্যান্ডেল করে না। পার্সিং lsআউটপুট কখনই নিরাপদ হয় না

² cdসম্ভবত ভয়ঙ্করভাবে দক্ষ হওয়ার দরকার নেই, তবে 6 টি প্রক্রিয়াটি কিছুটা অতিরিক্ত।


1
আমি আসলে zsh ব্যবহার করি তবে আপনি যদি পরবর্তী ফাংশনের লুপের প্রথম পরীক্ষাটি পরিবর্তন করেন [[ -n $foundcwd ]]তবে আপনার উত্তরটি ব্যাশ এবং zsh এর অধীনে কাজ করবে সমানভাবে। খুব সুন্দর, এবং এটি লেখার জন্য আপনাকে ধন্যবাদ।
এস্তেইস

4

নিম্নলিখিত ফাংশনটি সহোদর ডিরেক্টরিতে পরিবর্তনের অনুমতি দেয় (ব্যাশ ফাংশন)

function sib() {
    ## sib  search sibling directories 
    ##   prompt for choice (when two or more directories are found, current dir is removed from choices) 
    ##   change to directory after selection 
    local substr=$1
    local curdir=$(pwd)
    local choices=$(find .. -maxdepth 1 -type d -name "*${substr}*" | grep -vE '^..$' | sed -e 's:../::' | grep -vE "^${curdir##*/}$" | sort)
    if [ -z "$choices" ]; then
        echo "Sibling directory not found!"
        return
    fi
    local count=$(echo "$choices" | wc -l)
    if [[ $count -eq 1 ]]; then
        cd ../$choices
        return 
    fi
    select dir in $choices; do
        if [ -n "$dir" ]; then
            cd ../$dir
        fi
        break
    done
}

ব্যবহারের একটি উদাহরণ:

$ tree
  .
  ├── component-aaa-01
  ├── component-aaa-02
  ├── component-bbb-01
  ├── component-bbb-02
  ├── component-ccc-01
  ├── component-ccc-02
  └── component-ccc-03
  7 directories, 0 files
  $ cd component-aaa-01/
  $ sib bbb-01
  $ pwd
  component-bbb-01
  $ sib bbb
  $ pwd
  component-bbb-02
  $ sib ccc
  1) component-ccc-01
  2) component-ccc-02
  3) component-ccc-03
  #? 3
  $ pwd
  component-ccc-03
  $ sib 01
  1) component-aaa-01
  2) component-bbb-01
  3) component-ccc-01
  #? 2
  $ pwd
  component-bbb-01

খুব সুন্দর. আমি jw013 এর উত্তরকে গ্রহণযোগ্য হিসাবে রাখছি, কারণ আমার প্রশ্ন ও ব্যবহারের মামলাটি ছিল 'আমি পরের ভাইবোনটিতে যেতে চাই, এবং কী বলা হয় তা আমি যত্ন করি না'; তবে এটিও কার্যকর এবং নিফটিও কার্যকর, তাই আপনার একটি উত্সাহও রয়েছে।
এস্তেইস

2

কমান্ডলাইনফু.কম- এ আমি একটি টিপ খুঁজে পেয়েছি । আমি এখানে এটিকে আরও সন্ধানের জন্য এটি পুনরায় পোস্ট nextকরছি, যেখানে আমি উপস্থিত থাকাকালীন একটি ব্যাখ্যা এবং একটি কমান্ড যুক্ত করেছি।

alias prev='cd ../"$(ls -F .. | grep '/' | grep -B1 -xF "${PWD##*/}/" | head -n 1)"'
alias next='cd ../"$(ls -F .. | grep '/' | grep -A1 -xF "${PWD##*/}/" | tail -n 1)"'

যাদুটি `$ (...) ব্লকের মধ্যে রয়েছে। এটি একে অপরের মধ্যে কয়েকটি কমান্ড নিম্নলিখিতভাবে পাইপ করে:

ls -F .. |   # list items in parent dir; `-F` requests filetype indicators
grep '/' |   # select the directories (written as  `mydir/`)
grep -B1 -xF "${PWD##*/}/" |   # search for the name of the current directory in the output;
                               # print it and the line preceding it
head -n 1    # the first of those two lines contains the name of the previous sibling

2
আপনি যে কমান্ডটি পেয়েছেন তাতে বেশ কয়েকটি সমস্যা রয়েছে। আমি এটি সবচেয়ে গুরুতর বিষয়গুলি সংশোধন করার জন্য সম্পাদনা করেছি: এটি ডিরেক্টরি নামটিকে গ্রেপ প্যাটার্ন হিসাবে বিবেচনা করে এটি একটি স্ট্রিংয়ের সাথে মেলানোর অনুমতি দিয়েছিল; এবং এটি ডিরেক্টরির নাম শেল সম্প্রসারণ (শব্দ বিভাজন এবং globbing) দুইবার (: সর্বদা কাছাকাছি পরিবর্তনশীল এবং কমান্ড বদল ডবল কোট ব্যবহার ভুগা ছিল "$foo", "$(foo)")। উপরন্তু, আউটপুট পার্স lsউপরে ভরসা করা যায় , এটা ফাইল অমুদ্রণীয় অক্ষর ধারণকারী নামের সাথে বিফল হতে পারে।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.