มีคำสั่งให้ย้อนกลับหลายขั้นตอนในไดเรกทอรีโดยไม่ใช้ cd หรือไม่?


14

ฉันจะไป 'cd ../../../../' อย่างต่อเนื่อง มีคำสั่ง / นามแฝงที่สามารถให้ฉันไป 'cmd 4' และฉันจะถูกนำกลับ 4 ไดเรกทอรี?


ls? แน่นอนคุณหมายถึงcdอะไร
Chris Jester-Young

ใช่ฉันทำฉันเพิ่งเขียนมันด้วยความรวดเร็ว;) แก้ไขได้ทันที

สิ่งนี้จะทำอย่างไร:alias cmd5 = "cd ../../../../../"
ypercubeᵀᴹ

ฉันคิดว่าฉันสามารถเขียนมันออกมาได้ตั้งแต่ 1 ถึง 10 หรือมากกว่านั้น แต่มันก็ดีที่จะมีวิธีที่ฉลาดในการทำมัน นั่นไม่ได้นั่งกับฉัน จะทำเช่นนั้นหากไม่มีวิธีแก้ไขปัญหาอื่นเกิดขึ้น

คำตอบ:


16

ใส่สิ่งนี้ใน~/.bashrc:

cdup() {
  levels=${1-1}
  while ((levels--)); do
    cd ..
  done
}

(ชื่อcdupนั้นมาจากคำสั่ง FTP ที่เกี่ยวข้องเพียงแค่ FYI)


ขอบคุณสำหรับการตอบกลับไปพร้อมกับคำตอบของ jleedev เนื่องจากสั้นกว่า 1 บรรทัดและฉันไม่สามารถตัดสินใจได้ว่าจะเลือกใคร! ขอขอบคุณ!

@Muu: ทั้งสองคำตอบจะได้ผล แต่ของฉันจะใช้ได้กับหลาย ๆ ระดับและ @ jleedev จะใช้ได้กับกำมือเล็กน้อย (ไม่ จำกัด จำนวนสแต็ก) ;-) (ฉันแน่ใจว่าคุณจะไม่มีวันถึงขีด จำกัด แต่อย่างใดฉันก็เป็นคนทั่วไปมากขึ้นนั่นคือสิ่งที่ฉันพยายามจะทำ :-))
Chris Jester-Young

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

11

ฉันถูกสอนให้ใช้ 'pushd' และ 'popd' สำหรับสถานการณ์เช่นนี้

ตัวอย่างเช่นพิมพ์ 'pushd' จากนั้น 'cd / home' ตอนนี้พิมพ์ 'popd' แล้วคุณจะกลับไปที่จุดเริ่มต้น

'pushd' / 'popd' เป็นสแต็คคุณสามารถพุชไดเรกทอรีได้มากเท่าที่คุณต้องการ


หืมดี ไม่ได้ยินเลยว่า ไม่เหมาะกับสิ่งที่ฉันกำลังมองหา แต่จะใช้เช่นกัน ขอบคุณ

10

แน่นอนว่าทำไม:

ขึ้น () {
    [$ # = 0] && cd .. && กลับ
    [$ 1 = 0] && ผลตอบแทน
    cd .. && up $ (($ 1 - 1))
}

Bash ไม่ได้เรียกซ้ำแล้วซ้ำอีกใช่ไหม? up 500คุณอาจแตกล้นถ้าคุณทำ :-)
Chris Jester-Young

6
หากไดเรกทอรีของคุณซ้อนที่ลึกคุณมีความเห็นอกเห็นใจของฉัน
Josh Lee

ใช้สิ่งนี้ เอาชนะคริส 1 บรรทัด;)

@Muu: ฉันไม่รู้ว่าคำถามนี้เป็นรหัสกอล์ฟ! ;-) BTW มาร่วมกับเรา! codegolf.stackexchange.com
Chris Jester-Young

3
@Muu โปรดจำไว้ว่าการเรียกซ้ำไม่ใช่วิธีที่เหมาะสมในการเขียนเชลล์สคริปต์โดยทั่วไป
Josh Lee



1

คุณอาจต้องการใช้pushdและpopdตั้งเครื่องหมายสถานที่และกลับไปที่นั่นได้อย่างง่ายดายจากไดเรกทอรีที่คุณเปลี่ยนไป

คุณยังสามารถตั้งค่าตัวแปรด้วยชื่อของไดเรกทอรีที่คุณใช้บ่อยๆจากนั้นซีดีที่นั่น:

MYPROJ=~/projects/name/src
cd $MYPROJ
proj1='cd $MYPROJ'

1

ฉันใช้autojumpซึ่งอนุญาตให้ฉันพิมพ์:

j h
>> /home/cjulien
j et
>> /etc

มันสามารถเรียนรู้จากนิสัยของคุณและเบามาก (และเสพติด;))


1

สร้างเส้นทางโดยใช้printfแล้วcd:

cdup() {
    local path
    printf -v path '%*s' "${1:-1}"
    cd "${path// /../}"
}

ใช้เป็น:

cdup 4 # to go up four directories
cdup 1 # to explicitly go up one directory
cdup   # to implicitly go up one

0

ความคิดสองประการที่อาจเป็นประโยชน์กับคุณ:

  1. cd -
    เปลี่ยนกลับไปเป็นไดเรกทอรีสุดท้ายที่คุณใช้ฉันใช้สิ่งนี้ตลอดเวลาที่จะได้รับจากส่วนลึกลงไปในรหัสต้นไม้ของฉันกลับไปที่รูทของมัน ... เปลี่ยนแปลง

  2. cdd เก่าใหม่
    นี่เป็นฟังก์ชั่นสคริปต์ที่ฉันเคยเขียนในอดีตที่ฉันใช้ในการเคลื่อนที่ไปมาระหว่างต้นไม้ที่คล้ายกัน โดยทั่วไปจะใช้เวลาสองข้อโต้แย้งและ regexp บนเส้นทางของคุณที่ดีสำหรับการย้ายไปมาระหว่างสาขาและเช่น ตัวอย่างเช่นถ้าคุณอยู่ใน ~ / bzr / เว็บ / ลำ / เส้นทาง / เพื่อ / บาร์และจำเป็นต้องได้รับการ ~ / bzr / เว็บ / คุณลักษณะสาขา / เส้นทาง / เพื่อ / cdd trunk feature-branchคุณลักษณะแล้วคุณจะทำอย่างไร การนำไปใช้ที่ฉันมีอยู่เป็นภาษาของเชลล์โบราณบน AIX แต่มันค่อนข้างเล็กน้อยดังนั้นควรนำไปใช้ในเชลล์ที่เลือกได้ง่ายถ้าคุณต้องการ สำหรับเรามันมีประโยชน์มากเพราะโครงสร้างดูเหมือนว่า: ... / {product} / {version} / {release} / {src, bld, dbg, pkg, tst} / {component} / ... ดังนั้นการเคลื่อนไหว ในต้นไม้ต้นนั้นมันช่างค่อนข้างบ้า

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