ทุบตีซีดีจนในบางโฟลเดอร์


16

ฉันทำงานมากมายใน Magento และทำคนมากมายที่ฉันทำงานด้วยและมันก็น่ารำคาญที่ต้องพิมพ์:

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

หากต้องการพบว่าคุณยังคงมีไดเรกทอรีไม่กี่ไดเรกทอรีจากโฟลเดอร์ 'httpdocs' ของคุณดังนั้นฉันจึงพยายามสร้างสคริปต์ที่ตามด้วยรหัสหลอกนี้:

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

ดูเหมือนง่ายมากฉันสมมติว่าฉันต้องทำ grep บางรูปแบบในการตรวจสอบว่าส่วนสุดท้ายของไดเรกทอรีการทำงานปัจจุบันคือ httpdocs หรือไม่ถ้าไม่ใช่แค่เพิ่มระดับไปเรื่อย ๆ จนกว่ามันจะเป็นจริง

ฉันได้รับการดูการเรียนรู้ทุบตีนี้แม้ว่าดูเหมือนว่าจะต้องมีบางสิ่งบางอย่างออกมีแล้วที่คล้ายกันและไวยากรณ์ที่ไขปริศนาฉันไม่สิ้นสุด

คำตอบ:


8

สิ่งนี้จะต้องเป็นฟังก์ชั่นของเชลล์ไม่ใช่สคริปต์เนื่องจากสคริปต์ดำเนินการในเชลล์ใหม่ (ดังนั้นจึงไม่สามารถเปลี่ยนไดเรกทอรีของเชลล์เดิมได้)

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

แน่นอนคุณสามารถตั้งชื่อฟังก์ชั่นสิ่งที่คุณต้องการ

คำอธิบายบางอย่าง: การทดสอบครั้งแรก ( $PWD != '/') เป็นcdrootความล้มเหลวในกรณีที่คุณทำเมื่อคุณไม่ได้อยู่ในโฟลเดอร์ httpdocs มันจะหยุดเมื่อคุณไปถึงรูท

การทดสอบครั้งที่สอง ( ${PWD##*/} != 'httpdocs') ค่อนข้างซับซ้อนกว่าเล็กน้อย $PWDเป็นตัวแปรที่มีเส้นทางของไดเรกทอรีปัจจุบัน ${PWD##*/}ตัดแต่งทุกอย่างจนถึงและรวมถึงการเฉือนสุดท้าย


ข้อเสียของการทำซ้ำนี้คือคุณสูญเสียความสามารถในการทำcd -หลังจากนั้นกลับไปยังที่ที่คุณอยู่
Ezequiel Muns

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ได้
cjm

@drogbane: jdดูเหมือนจะไม่ทำงานในทุกกรณีคุณจะอธิบายว่ามันทำงานอย่างไร
Cesar

@ Cesar ใช้ globstar ( **) shopt -s globstarต้องการเปิดใช้งานคุณลักษณะนี้ในการใช้เปลือกทุบตีของคุณ
dogbane

2
นี่เป็นสิ่งที่ยอดเยี่ยมมากฉันหวังว่าฉันจะโหวตได้สองครั้ง
droope

1
ฉันได้รวมถึงการตรวจสอบแบบไดนามิก shopt และเปิดใช้งานในjdฟังก์ชั่นดูgist.github.com/Rob--W/5888648 ฉันเพิ่งทดสอบด้วย Bash 4.2.45 ดังนั้น YMMV
Rob W

5

ฟังก์ชั่นทุบตีที่ง่ายที่สุดที่คุณสามารถใส่ลงไปใน.bashrcสิ่งที่ฉันคิดได้ (ง่าย ๆ เพราะมันไม่ได้ใช้ลูปหรือกระบวนการภายนอก) คือ:

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

นี้ใช้รูปแบบการทดแทนการขยายตัวพารามิเตอร์ที่จะเปลี่ยนทุกอย่างหลังจาก/httpdocs/ใน$PWDด้วย `/ httpdocs' ดูเหมือนยุ่งมากเพราะเราต้องหลบหลีกเครื่องหมายสแลชในเส้นทางเพื่อแยกความแตกต่างจากเครื่องหมายสแลชข้างหน้าในไวยากรณ์ส่วนขยายของ bash เครื่องหมายบวกจะไม่หลุดไปข้างหน้าเครื่องหมายทับในสตริงการแทนที่ดังนั้นมันจึงดูไม่สอดคล้องกัน

หากไม่มี/httpdocs/ในเส้นทางปัจจุบันจะไม่มีการแทนที่และจะเปลี่ยนเป็นไดเรกทอรีปัจจุบัน

ตัวอย่างเช่นการทดแทนจะแทนที่/a/b/c/httpdocs/e/f/gด้วย/a/b/c/httpdocsและcdลงในไดเรกทอรีนั้น

ฟังก์ชันต้องอยู่ในสภาพแวดล้อมเชลล์ปัจจุบันของคุณ (ไม่ว่าจะเป็นฟังก์ชันหรือนามแฝง) เนื่องจากกระบวนการลูกไม่สามารถเปลี่ยนไดเรกทอรีปัจจุบันของพาเรนต์ได้ นี่คือเหตุผลที่ฉันพูดเพื่อวางไว้ในของคุณ.bashrcและไม่อยู่ในเชลล์สคริปต์


บังเอิญมันมีค่ากล่าวถึงว่าจะนำคุณสูงในลำดับชั้นที่เป็นไปได้ (ซึ่งอาจเป็นกรณีการใช้งานที่มีประโยชน์มากที่สุดต่อไป)
อิบราฮิม

3

คุณสามารถใส่อะไรแบบนี้ลงในโปรไฟล์ของคุณ:

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

เพียงพิมพ์cdhจะพาคุณไปยังhttpdocsไดเรกทอรีสูงสุดในเส้นทางปัจจุบันของคุณ


2

มันไม่ได้แก้ปัญหาของคุณอย่างสมบูรณ์ แต่มันจะประหยัดในการทำcd ../../../../../../บิต ผมเคยยืมนี้จากผู้ใช้ที่ไม่รู้จักโพสต์ของที่นี่


ขึ้น N

ข้ามไดเรกทอรี 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.