การใช้ cd เพื่อเพิ่มระดับไดเรกทอรีหลายรายการ


39

ฉันกำลังจัดการกับโปรเจ็กต์ของจาวาซึ่งมักจะส่งผลให้เกิดโฟลเดอร์ที่ซ้อนกันอย่างลึกซึ้ง (/ path / to / project / com / java / lang / อะไรก็ตาม) และบางครั้งต้องการที่จะสามารถกระโดดพูดไดเรกทอรี 4 ระดับขึ้นไป การพิมพ์ cd ../../../ .. เป็นความเจ็บปวดและฉันไม่ต้องการเชื่อมโยง มีแฟล็กไปยังซีดีที่ให้คุณเพิ่มระดับไดเรกตอรีหลายระดับหรือไม่ น่าเสียดายที่ฉันไม่พบหน้า man ใด ๆ สำหรับ cd โดยเฉพาะแทนที่จะได้รับหน้า "builtins" ที่ไม่มีประโยชน์


1
การแก้ไข bash เพื่อตีความcd ...ตำแหน่งของ '.' จะเป็นจำนวนระดับที่จะขึ้นไป นี่จะทำให้เกิดความขัดแย้งที่ฉันไม่ทราบหรือไม่?

สำหรับผู้ที่มาที่นี่เพื่อ MacOS คุณสามารถติดตั้งzshและOh My Zshเป็นทางเลือกที่ดีกว่าbashและจากนั้นคุณสามารถทำได้cd ...(หลายจุด) อย่างที่ควรจะเป็น
Dominic

คำตอบ:


29

หรือ ... ลองทำสิ่งนี้: (yay Google)

สำรวจไดเรกทอรีโดยใช้ .. n:

ในตัวอย่างด้านล่าง .. .. 4 ใช้ระดับไดเรกทอรีสูงสุด 4 รายการ ..3 เพื่อเพิ่มระดับไดเรกทอรี 3 ระดับ ..2 เพื่อเพิ่มระดับไดเรกทอรี 2 ระดับ

เพิ่มนามแฝงต่อไปนี้ใน. bash_profile และล็อกอินอีกครั้ง

alias .. = "cd .. "

alias ..2 = "cd ../ .. "

alias ..3 = "cd ../../ .. "

( ฯลฯ )

ดูแฮ็ค # 2


10
ผมค่อนข้างจะใช้นามแฝง.., ...และ....ที่พวกเขาจะได้เร็วขึ้นกับชนิด แต่หลักการของนามแฝงจะเหมือนกันแน่นอน
Bernhard

1
@bernhard คุณยินดีเป็นอย่างยิ่งเพราะฉันไม่เชื่อว่ามันจะทำให้เกิดความขัดแย้งใด ๆ ฉันทิ้งมันไว้ตามที่เป็นเพราะฉันยกมาจากเว็บไซต์
cutrightjm

4DOS.EXE เชลล์สำหรับ DOS รองรับcd ...เช่นกันcd ....ฯลฯ มันมีประโยชน์มาก
Alexios

..... ไม่เร็วกว่า .. 4 ที่จริงแล้วมันช้ากว่าตัวละคร 2 ตัว ..
Ryan

29

ฟังก์ชั่นง่าย ๆ พร้อมนามแฝงด้วย:

function cd_up() {
  cd $(printf "%0.s../" $(seq 1 $1 ));
}
alias 'cd..'='cd_up'

(คุณสามารถกำหนดสิ่งนี้ได้~/.bashrcหากคุณต้องการในทุกกรณี)

มันใช้ง่าย:

$ cd.. 10

ทำได้ดีนี่! ใช้งานได้สำหรับฉัน! Bash 4.3.11
Carlos Nunez

2
คำตอบที่ดี; คุณอาจต้องการที่จะชี้ให้เห็นว่านี้จะดีกว่าการแก้ปัญหาเช่นeval $(printf "cd ..;%.s" $(seq $1))ที่cdหลาย ๆ ครั้งเพราะ~-aka $OLDPWDมีการตั้งค่าไปยังไดเรกทอรีทำงานจากที่ก่อนที่จะภาวนามากกว่าที่จะไดเรกทอรีกลาง PS - ช่วยลดความยุ่งยากcd $(printf %.s../ $(seq "$1"))หากคุณต้องการ
Toby Speight

10

วิธีแก้ปัญหาที่ง่ายและใช้เทคโนโลยีต่ำซึ่งไม่จำเป็นต้องติดตั้งใด ๆ ใช้งานได้ในเชลล์ด้วยbashการแก้ไขคำสั่ง -style เท่านั้น

  • ชนิด cd ..
  • กดUp-arrow Returnหลาย ๆ ครั้งตามต้องการ เร็วมากถ้าคุณใช้สองนิ้ว

2
ฮ่า ๆ ไม่ได้คำตอบที่ไม่ดีผมคิดว่า :)
joshmcode

8

เปลี่ยนคำตอบที่ถูกต้องคือ 'cd + n' โดยที่ n คือจำนวนระดับที่คุณต้องการขึ้นไป น่าเสียดายที่นี่ไม่มีการบันทึกไว้ที่ใดเลย!


17
อย่างน้อยมันไม่ทำงานในการทุบตี
HongboZhu

5
ไม่ทำงานบนทุบตี 4.2.25 ตามที่จัดส่งโดย Debian คุณอยากใช้ * nix และ / หรือ shell ใด?
Alexios

ทุบตีได้ในตัวเรียกdirsว่าใช้เวลา [+] n เป็นอาร์กิวเมนต์และพิมพ์ไดเรกทอรีที่ไม่ซ้ำกันที่ n pushdที่ถูกเพิ่มผ่าน ถ้าคุณalias cdทำpushdแล้วคุณสามารถใช้สิ่งนี้ อย่างไรก็ตามโปรดทราบว่านี่ไม่ใช่เทคนิคคำตอบสำหรับคำถามของ OP เพราะสิ่งนี้เกี่ยวข้องกับไดเร็กตอรี่ที่ไม่เหมือนใครซึ่งหมายความว่าคำสั่งนั้นจะสับสนเมื่อเวลาผ่านไปเมื่อคุณกลับไปที่ไดเรคทอรีเดียวกัน
Brian Peterson

ใช่pushdและpopdยังใช้เวลา n [+] ตัวเลือกซึ่งเป็นเหตุผลที่สามารถทำงาน นอกจากนี้แม้ว่ามันจะไม่สมบูรณ์และโดยอ้อม แต่ฉันคิดว่านี่สามารถใช้เป็นคำตอบสำหรับคำถามได้ บ่อยครั้งที่คุณเยี่ยมชมไดเรกทอรีด้านบนคุณเมื่อเร็ว ๆ นี้ดังนั้นพวกเขาจะอยู่ใน 10 dirs ล่าสุดที่จัดเก็บโดยไดเรกทอรีสแต็ก
Brian Peterson

ไม่ได้ผลสำหรับฉัน ...
Vass

4

คุณสามารถเขียนฟังก์ชั่น (มันจะต้องมีฟังก์ชั่นตามที่คุณต้องการเปลี่ยนสถานะของเชลล์ของคุณเองคือไดเรกทอรีการทำงานคำสั่งภายนอกจะส่งผลต่อกระบวนการของตัวเองเท่านั้น)

นี่คือฟังก์ชั่นที่จะขึ้นไปจำนวนของระดับที่ส่งผ่านเป็นอาร์กิวเมนต์ (ค่าเริ่มต้น 1) ในส่วนทางกายภาพโครงสร้างไดเรกทอรี (เพื่อให้เหมือนcd -P .., nครั้ง):

up() {
    # default parameter to 1 if non provided
    declare -i d=${@:-1}
    # ensure given parameter is non-negative. Print error and return if it is
    (( $d < 0 )) && (>&2 echo "up: Error: negative value provided") && return 1;
    # remove last d directories from pwd, append "/" in case result is empty
    cd "$(pwd | sed -E 's;(/[^/]*){0,'$d'}$;;')/";
}

ใช้แบบนี้:

up 4

1
ในขณะที่รหัสนี้อาจตอบคำถาม แต่มีบริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีการที่รหัสนี้ตอบคำถามช่วยปรับปรุงมูลค่าระยะยาว
Donald Duck

1
ตกลงฉันได้เพิ่มความคิดเห็นเล็กน้อยเพื่อช่วย
mgild

จะเป็น nitpicky up 4จริง ๆไม่เทียบเท่ากับการcd /some/dir/สมมติ$PWD = "/some/dir/that/is/deeply/nested/"?
snapfractalpop

2

ไม่ตรงกับสิ่งที่คุณขอ แต่คุณควรมีลักษณะเป็นและpushd popdฉันพบว่ามีประโยชน์มากกว่าสำหรับการนำทางโฟลเดอร์มากกว่าcd...นามแฝงบางรายการ

หากคุณกำลังเดินทางไปและกลับจากพื้นที่ที่มีคู่คงที่สิ่งปกติคือการมีนามแฝง

alias proj1='cd /some/dir/containing/proj1'
alias proj2='cd /some/deeper/dir/structure/containing/proj2'

1

แทนที่จะใช้นามแฝงคุณสามารถใช้ฟังก์ชันทุบตีต่อไปนี้:

function mcd() {
  up=""

  for ((i=1; i<=$1;i++)); do
    up="${up}../"
  done

  cd $up
}

(หรือเป็นหนึ่งซับ: function mcd() { up=""; for ((i=1; i<=$1;i++)); do up="${up}../"; done; cd $up; })

เพิ่มสิ่งนี้ในของคุณ ~/.bashrcไฟล์จะทำให้มันพร้อมใช้งานในเทอร์มินัลของคุณและการสร้างสตริง../../../../../../ก่อนการโทรcdจะทำให้สามารถใช้cd -เพื่อข้ามไปยังไดเรกทอรีเริ่มต้นได้

การใช้งานที่เป็นประโยชน์มากขึ้นอาจมีการตรวจสอบจากผู้ใช้:

function mcd() {
    if [[ $1 -lt 1 ]]; then
        echo "Only positive integer values larger than 1 are allowed!" >&2
        echo -e "\n\tUsage:\n\t======\n\n\t\t# to go up 10 levels in your directory\n\t\tmcd 10\n\n\t\t# to go up just 2 levels\n\t\tmcd 2\n" >&2
        return 1;
    fi  

    up=""

    for ((i=1; i<=$1;i++)); do
        up="${up}../"
    done

    cd $up
}

0

คุณรู้เกี่ยวกับautojumpหรือไม่? เป็นการแฮ็คบุคคลที่สาม แต่อาจมีประโยชน์ในสถานการณ์ของคุณ


0

ลองใช้พารามิเตอร์สภาพแวดล้อมที่ไม่ค่อยได้ใช้ CDPATHลองสภาพแวดล้อมพารามิเตอร์ที่ไม่ค่อยได้ใช้จากนั้นคุณอาจไม่ต้องตั้งค่าระดับอย่างชัดเจน

ตัวอย่าง:

$ find workspace -type d
workspace
workspace/project1
workspace/project1/com
workspace/project1/com/java
workspace/project1/com/java/lang

$ CDPATH=".:~/workspace:~/workspace/project1:~/workspace/project1/com:~/workspace/project1/com/java:~/workspace/project1/com/java/lang"
$ cd com
$ pwd
~/workspace/project1/com

หากทำงานกับหลายโครงการคุณสามารถทำให้การตั้งค่า CDPATH เป็นไฟล์สภาพแวดล้อมเฉพาะของโครงการ และทริกเกอร์ด้วย shim สำหรับระบบอัตโนมัติเพิ่มเติม

ฉันมักจะใช้ pushd และ popd ค่อนข้างมาก ฉันมักจะใช้ CDPATH เพื่อให้ฉันกระโดดระหว่างต้นไม้โครงการแทนที่จะเป็นโครงการย่อย - แต่ในขณะนี้ฉันกำลังทำงานในโครงการขนาดเล็กจำนวนมากไม่ใช่โครงการขนาดใหญ่บางโครงการ :)


0

หากก่อนหน้านี้คุณอยู่ในไดเรกทอรีเป้าหมาย:

luna:/tmp % mkdir -p a/b/c/d
luna:/tmp % pwd
/tmp
luna:/tmp % cd a/b/c/d
luna:d % pwd
/tmp/a/b/c/d
luna:d % cd -
luna:/tmp % pwd
/tmp
luna:/tmp % 

0

ลองดูที่ DirB เป็นสคริปต์ BASH ที่ให้คุณสร้างบุ๊คมาร์คได้ดังต่อไปนี้:

การดำเนินงาน

  • บันทึกบุ๊คมาร์คไดเรกทอรี
  • g ไปที่คั่นหน้าหรือไดเรกทอรีที่ตั้งชื่อ
  • p ดันบุ๊กมาร์ก / ไดเร็กทอรีไปยังสแต็ก dir
  • r ลบบุ๊คมาร์คที่บันทึกไว้
  • แสดงเส้นทางไดเรกทอรีบุ๊กมาร์ก
  • sl พิมพ์รายการบุ๊คมาร์คไดเรกทอรี

ง่ายมากมีประสิทธิภาพมาก


0

ขั้นตอนต่อไปจากคำตอบของ @ Grigory:

function cd_up() {
if [ -z "$1" ]; then
    cd ..
else
    cd $(printf "%0.s../" $(seq 1 $1 ))
fi
}
alias 'cdd'='cd_up'

นั่นคือ :

// go up 1 directory level 
$cdd

// go up 3 directory level 
$cdd 3

0

ได้ป่วยของปัญหาเดียวกันนี้แน่นอนและจบลงด้วยการเขียนแผ่น CD-บวกเป็นผล ยูทิลิตี้ไฟล์ CLI เดียวที่ช่วยให้คุณทำซีดีหลายไดเรกทอรี

การใช้

echo `pwd` # /foo/bar/foobar/baz/foobaz/bazfoo
d baz

echo `pwd` # /foo/bar/

0

การเพิ่มโค้ดด้านล่างลงในของคุณ.bashrcจะทำให้การcdเติมเต็มสมบูรณ์เพื่อเป็นเกียรติแก่เครื่องหมายบวกสามจุด

_cd_dot_expansion() {
    local path="${COMP_WORDS[COMP_CWORD]}"

    if [[ "${path}" =~ ^\.{3,} ]]; then
        local dots="${BASH_REMATCH}"
        local levels="${#dots}"
        local tail="${path##*...}"
        local expanded_dots='..'

        # the loop starts at two because the first set of dots is
        # assigned to `expanded_dots` when it is initialized
        for (( i = 2; i < "${levels}"; i++ )); do
            expanded_dots+='/..'
        done

        path="${expanded_dots}${tail}"
        COMPREPLY=( $( compgen -A file "${path}" ) )

        return
    fi

    _cd
}

complete -o nospace -F _cd_dot_expansion cd

เมื่อข้อมูลโค้ดนี้ทำงานในการพิมพ์cd .../และการกดปุ่มbash shell ของคุณ<TAB>จะทำให้เส้นทางไป../../และแสดงรายการเส้นทางสัมพัทธ์ของไดเรกทอรีทั้งหมดที่มีสองระดับขึ้นไป

อัปเดต : bash-completionต้องติดตั้งเพื่อให้สามารถเข้าถึง_cdวิธีการอ้างอิงในรหัสด้านบน สามารถติดตั้งผ่านผู้จัดการแพคเกจบรรทัดคำสั่งส่วนใหญ่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.