ฉันจะเปลี่ยนเป็นไดเรกทอรีก่อนหน้าแทนที่จะขึ้นไปได้อย่างไร


214

ขณะนี้ฉันใช้เวลาทำงานจำนวนมากย้ายไปมาระหว่างสองเส้นทางซึ่งอยู่ไกลจากต้นไม้มากและเบี่ยงเบนจากกันและกัน มันทำให้ฉันรู้สึกว่าชีวิตของฉันจะง่ายขึ้นมากถ้ามีข้อโต้แย้งcdว่าจะนำผู้ใช้ไปยังไดเรกทอรีสุดท้ายที่พวกเขาอยู่

นั่นคือถ้าฉันอยู่ใน:

/etc/foo/bar/baz/moo

จากนั้นพิมพ์:

cd /var/lib/fubarred_app/blargh/logs

ฉันต้องการกลับไปยังไดเรกทอรีแรกโดยไม่ต้องพิมพ์เส้นทางทั้งหมดอีกครั้ง

คีย์หน่วยความจำไม่ตัดเนื่องจากฉันใช้คำสั่งเพียงพอในแต่ละสถานที่ซึ่งมันยากพอที่จะย้อนกลับไปและค้นหาเส้นทางที่ฉันต้องการเพราะมันคือการพิมพ์ด้วยตัวเอง

มีคำสั่งสั้น ๆ ที่จะให้ฉันไปที่ไดเรกทอรีก่อนหน้าหรือไม่


8
นอกจากคำตอบที่ยอดเยี่ยมของ@ bryanคุณอาจพิจารณาสร้างชื่อแทนคู่สำหรับแต่ละเส้นทางเพื่อให้คุณสามารถพิมพ์บางสิ่งเช่น: " bazmoo" หรือ " blarghlog" ที่พร้อมท์ :)
warren

4
ทำไมคุณไม่เพียงแค่ใช้หน้าจอ GNU ?
Shi

2
เปลือกไหน ที่สร้างความแตกต่างอย่างมาก
Randal Schwartz

@warren เหมือนกัน นั่นเป็นวิธีที่ฉันชอบทำทุกอย่าง ครึ่งหนึ่งของสิ่งที่ฉันใช้คอมพิวเตอร์เพื่อมีนามแฝงของตัวเองตอนนี้ ... =)
ixtmixilix

Fasd ยอดเยี่ยม ลองดูสิ
majkinetor

คำตอบ:


301

คำสั่ง

cd -

จะทำการสลับที่คุณต้องการในเชลล์หลักส่วนใหญ่ตัวแปรที่เก่ากว่าจะเป็น

cd "$OLDPWD"

ซึ่งจะใช้ตัวแปรสภาพแวดล้อมที่มีไดเรกทอรีทำงานก่อนหน้า


หน้าคน POSIX สำหรับcdกล่าวถึง:

รายละเอียด

หากในระหว่างการดำเนินการตามขั้นตอนข้างต้นตัวแปรสภาพแวดล้อม PWD จะเปลี่ยนไปตัวแปรสภาพแวดล้อม OLDPWD จะถูกเปลี่ยนเป็นค่าของไดเรกทอรีการทำงานเก่า (นั่นคือไดเรกทอรีการทำงานปัจจุบันทันทีก่อนการเรียกไปยัง cd)

ถูกดำเนินการ

  -   เมื่อใช้ยัติภังค์เป็นตัวถูกดำเนินการนี้จะเทียบเท่ากับคำสั่ง:

cd "$OLDPWD" && pwd 

ซึ่งเปลี่ยนเป็นไดเร็กทอรีการทำงานก่อนหน้านี้จากนั้นเขียนชื่อของมัน


7
โปรดจำไว้ว่าสิ่งนี้ขึ้นอยู่กับเชลล์ที่คุณใช้และเนื่องจากคุณไม่ได้ระบุจึงเป็นการยากที่จะให้คำตอบ "พกพา" ที่ไม่มีอยู่จริง
Randal Schwartz

16
@ Randall บางทีคุณสามารถรวมข้อคิดเห็นเชลล์ของคุณทั้งหมดเป็นคำตอบ Voltron-Shell เดียว
hyperslug

@Randall ฉันใช้ทุบตี มันทำงานใน ksh และ zsh ด้วย ยังไงก็ตามฉันเรียนรู้ที่จะเขียนโปรแกรมจากLearning Perlฉบับปี 1994 ดังนั้นจึงขอโทษในขณะที่ฉัน fanboy เล็กน้อย :)
Yitzchak

อืมฉันใช้cd $OLDPWDสิ่งนี้ เป็นเรื่องดีที่กระสุนหลักนำเสนอรูปแบบที่สั้นกว่า
ulidtko

2
รสชาติบาง @sinni ไม่ได้pushdและอย่างน้อยก็เป็น builtin bashใน
slhck

105

นอกจากคำตอบของไบรอันแล้วมันก็คุ้มค่าที่จะกล่าวถึงนอกจากนี้pushdและยังpopdสร้างไดเรกทอรีเช่นกองซ้อน นอกจากนี้ยังมีใน Windows NT; อย่างไรก็ตามมันไม่สามารถใช้ได้ในทุกเชลล์

ตัวอย่างเช่นเราสามารถไปที่สามไดเรกทอรีที่แตกต่างกันและคุณจะเห็นสแต็คของคุณเมื่อคุณโทรpushd:

charon:~ werner$ pushd Documents/
~/Documents ~

charon:Documents werner$ pushd ../Movies/
~/Movies ~/Documents ~

charon:Movies werner$ pushd ../Downloads/
~/Downloads ~/Movies ~/Documents ~

และเมื่อคุณโทรpopdถึงสามครั้งติดต่อกันคุณจะไปยังไดเรกทอรีเหล่านั้นในสแต็กตามลำดับย้อนกลับ ในเวลาเดียวกันสแต็คจะถูกล้างอีกครั้ง

charon:Downloads werner$ popd
~/Movies ~/Documents ~

charon:Movies werner$ popd
~/Documents ~

charon:Documents werner$ popd
~

charon:~ werner$ popd
-bash: popd: directory stack empty

หากคุณกำลังใช้ Zsh; มีตัวเลือก AUTO_PUSHD ซึ่งจะกดcdลงบนสแต็กโดยอัตโนมัติ


pushd และ popd ไม่สามารถใช้ได้ในทุกเชลล์
Randal Schwartz

5
@ Wiesław: จริงเหรอ? ฉันหวังว่าทุบตีมีว่า ... แน่นอนฉันจะนามแฝงcdไปpushdและก็ต้องการส่วนใหญ่จะเหมือนกัน
Chris Charabaruk

3
หรือนามแฝง pd เพื่อ pushd และมีทั้ง BTW pushd (หรือ pd ถ้าคุณใช้นามแฝง) ด้วยตัวเองจะสลับไดเรกทอรีปัจจุบันและไดเรกทอรีสุดท้ายที่ผลักดันให้บรรลุสิ่งที่ 'cd -' ทำ
JRobert

ฉันชอบแนวคิด แต่ไม่เคยชินกับมันเลย
Thorbjørn Ravn Andersen

13

มีบางโปรแกรม "กระโดด"

  • autojump (ปรับปรุงด้วยคุณสมบัติพื้นฐาน)
  • j2 (เห็นได้ชัดว่าไม่มีคุณสมบัติขั้นสูงบางอย่าง)
  • z (รุ่นที่ปรับปรุงแล้วของ "j" พร้อมคุณสมบัติขั้นสูง)

ช่วยให้การนำทางไดเรกทอรีอย่างง่ายดาย คุณใช้มันโดยให้ส่วนของเส้นทางและใช้งานได้

ในกรณีของคุณ

~$ j baz 
/etc/foo/bar/baz/moo$

~$ j bla 
/var/lib/fubarred_app/blargh/logs$

คุณสามารถกำหนดจดหมายใด ๆ ที่คุณต้องการให้กับโปรแกรมเหล่านี้ "j" เป็นธรรมเนียม :)

j2 และ z รองรับคำค้นหาหลายคำ ...

~$ j baz src
/home/me/projects/baz/repository/trunk/src$

... และตัวเลือกเพิ่มเติม

~$ j -l  # list directories by "frecency"(frequency + recency) score
~$ j -r PATTERN # match by rank only, not recency
~$ j -t PATTERN # match by recency only, not rank

2
"j" เป็นเปลือกที่เฉพาะเจาะจงอย่างชัดเจน คุณไม่ได้พูดอย่างนั้น
Randal Schwartz

3
@ ที่ดิน: มันเป็นเปลือกเฉพาะ? มันเป็นโปรแกรม
Fixee

3
ฉันเป็นคนงี่เง่า :) ฉันเห็นแล้วตอนนี้
Randal Schwartz

10

นอกจากนี้ cd -และcd $OLDPWD

คุณสามารถใช้การค้นหาประวัติโดยกดCTRL-Rและพิมพ์ตัวอักษรสองสามตัวของcdคำสั่งที่คุณป้อนก่อนหน้า การกดCTRL-Rซ้ำ ๆ จะทำให้การแข่งขันแบบเก่า ๆ

วิธีนี้จะมีประโยชน์มากขึ้นถ้าคุณมีมากกว่าสองเส้นทางที่จะเปลี่ยน


1
CTRL-R ไม่จำเป็นต้องช่วย คุณอาจอยู่ใน / some / obscure / directory / deep และทำ "cd evendeeperdir" จากนั้นไปที่ ~ / somehere / different
justintime

1
ที่ดี! มันใช้งานได้กับสิ่งอื่นนอกจากcdความช่วยเหลือที่ดี!
Niloct

9

คุณสามารถใช้สิ่งนี้เพื่อสร้างนามแฝงสำหรับไดเรกทอรีได้อย่างง่ายดาย:

a() { alias $1=cd\ $PWD; }

a 1

และหลังจากนั้น:

1

1
บนเชลล์ที่เข้าใจนามแฝงและฟังก์ชันเท่านั้น ไม่ทั้งหมดทำ
Randal Schwartz

ดังนั้นการข้ามalias =ส่วนนี้พิมพ์หรือไม่ hmmmm
Xen2050

6

bashmarksจะทำให้คุณคั่นหน้าชุดของโฟลเดอร์และข้ามไปมาได้ด้วยการทำแท็บเสร็จ:

หากต้องการบุ๊กมาร์กโฟลเดอร์ให้ไปที่โฟลเดอร์นั้นแล้วทำบุ๊กมาร์กเช่น:

bookmark foo

บุ๊กมาร์กจะมีชื่อว่า "foo" เมื่อคุณต้องการกลับไปที่โฟลเดอร์นั้นให้ใช้:

go foo

วิธีดูรายการบุ๊คมาร์ค:

bookmarksshow

การทำงานให้เสร็จสมบูรณ์ของแท็บหากต้องการไปที่บุ๊กมาร์ก shoobie เพียงทำตาม:

go sho[tab]

4

ความเป็นไปได้อีกอย่างก็คือเปิดหน้าต่างทั้งสองไว้เพียงหน้าต่างเดียวโดยวางตำแหน่งไว้ที่แต่ละไดเรกทอรี


แม้ว่าจะไม่มีประวัติการแชร์หากคุณใช้ / แก้ไขคำสั่งก่อนหน้าอย่างสม่ำเสมอ (อาจเป็นการรีเซ็ตจะทำให้พวกเขา ... ?)
Xen2050

@ Xen2050 ดูตัวเลือกเชลล์share_historyใน zsh
Radon Rosborough

4

ฉันรู้ว่านี้ไม่ได้พูดอย่างเคร่งครัดคำตอบสำหรับคำถามของคุณ แต่ก็เป็นประโยชน์ในการเข้าถึงเป้าหมายของพาคุณไปยังไดเรกทอรีที่สำคัญของคุณ

ใน UNIX-bash ใด ๆ คุณสามารถใช้CDPATHเพื่อขยายโฟลเดอร์ที่คำสั่ง cd-search ค้นหา

จากไฟล์. bashrc ของฉัน:

export CDPATH='.:~/source/'

cdค้นหาครั้งแรกในโฟลเดอร์ปัจจุบันของคุณจากนั้นค้นหาในไดเรกทอรีการเข้ารหัสของฉัน

cd myproject

.. พาฉันไปที่/ / แหล่งที่มา / โครงการของฉันจากที่ฉันเคยยืนอยู่

คุณสมบัติเล็ก ๆ น้อย ๆ ที่เรียบง่ายที่ช่วยนำทางไดเรกทอรีของฉันเป็นอย่างมาก


1
+1 นี่เป็นการเพิ่มโฟลเดอร์ CDPATH ในcdรายการเติมข้อความอัตโนมัติ (TAB) ซึ่งดี แต่ถ้า.ไม่รวมอยู่และหากมีโฟลเดอร์ในโฟลเดอร์ CDPATH ที่มีชื่อเดียวกับในไดเรกทอรีปัจจุบันของคุณแล้วcd samenameจะไปที่ไดเรกทอรี CDPATH และไม่ใช่หนึ่งในไดเรกทอรีปัจจุบันซึ่งไม่ดี ต้องใช้cd ./samenameเพื่อเข้าสู่โฟลเดอร์ซ้ำ
Xen2050

ใช่ความคิดเห็นที่ดี รวมถึงก่อนเสมอ หรือคุณจะพบกับสิ่งแปลก ๆ
phareim

3

ใช่cd -เป็นวิธีที่จะไป แต่ฉันกังวลเกี่ยวกับการขาดพลังงานที่คุณมีในเปลือกของคุณ popdและpushdก็ดีและjสิ่งนั้นก็ดูดีเช่นกัน

ฉันจะโยนยูทิลิตี้ของตัวเองเข้าไปในวงแหวน ... มันเป็นสิ่งที่ฉันกำลังสร้างปรับแต่งและโยกย้ายกับฉันในช่วง 10 ปีที่ผ่านมาและมันก็ใช้ได้ดีสำหรับสิ่งที่ฉันต้องการให้มันทำ

โพสต์บล็อกสำหรับยูทิลิตี้การจัดการไดเรกทอรีของฉัน

ถ้ามันเหมาะกับคุณแล้วก็เจ๋ง แต่ถ้ามันไม่ได้สัญญากับฉันคุณจะได้อย่างอื่น :) คุณแค่อยู่cdคนเดียวไม่ได้


3

หากคุณมี 2 ไดเรกทอรีเท่านั้นวิธีที่ง่ายที่สุดคือดังที่กล่าวไว้

cd -

เมื่อก่อนฉันเคยทำสิ่งนี้มาก่อนฉันมีเล่ห์เหลี่ยมบางอย่างที่ฉันเคยทำนั่นอาจเป็นประโยชน์

  1. ใส่คำสั่ง alias ในไฟล์. cshrc บางอย่างเช่นนี้

    alias moo /etc/foo/bar/baz/moo  
    alias logs cd /var/lib/fubarred_app/blargh/logs
    
  2. เชื่อมโยงทางลัดไปยังเส้นทางที่น่าสนใจจากไดเรกทอรีบ้านของฉัน นี่คือสิ่งหนึ่งครั้ง

    cd ~
    ln -s /var/lib/fubarred_app/blargh/logs blargh
    ln -s /etc/foo/bar/baz/moo
    

การทำเช่นนี้จะช่วยให้เปลี่ยนไดเรกทอรีได้ง่ายเหมือน:

   cd ~/moo
   cd ~/blargh

2

Autojumpเป็นคำสั่ง bash / sh / zsh "cd" ซึ่งจากการกระทำของคุณดูวิดีโอนี้

ดังนั้นสิ่งนี้จะย้ายคุณไปที่หมู่หลังจากเรียนรู้โฟลเดอร์สุดท้ายแล้ว

j moo

2

คาน

ฉันมีเครื่องมือของตัวเอง แต่จะดูที่เครื่องมือ Dereks และjด้วย

แน่นอนตัวเลือกแรกสำหรับการกระโดดไปมาคือ

ซีดี -

เครื่องมือของฉันมีไว้สำหรับไดเรกทอรีที่มีชื่อเฉพาะในระบบซึ่งlocateมีให้ใช้งาน มันจะค้นหาชื่อไดเรกทอรีที่ตรงกันและข้ามไปยังการจับคู่แรก:

beam () 
{ 
    ldir=$(locate $1 | egrep "$1$" | head -n 1);
    if [[ -d $ldir ]]; then
        echo $ldir;
        cd $ldir;
    else
        echo "no directory "$ldir;
    fi
}

อ้างอิง:

  • ตั้งอยู่
  • grep
  • หัว

ข้อเสีย:

  • ไม่พบไดเรกทอรีที่ใหม่กว่าที่อัพเดต b-run ครั้งล่าสุด
  • หากมีมากกว่าหนึ่งไดเรกทอรีที่ตรงกันมันขึ้นอยู่กับโชคของคุณ

การปรับปรุง / แก้ไข:

  • แทนที่จะเลือกไดเรกทอรีแรกรหัสสามารถปรับเปลี่ยนเพื่อแสดงรายการตัวเลือกพร้อมท์ให้ผู้ใช้ป้อน 1,2,3, ... เพื่อไปที่ / bin, / usr / bin, / usr / local / bin ...

การใช้งาน:

  • ใส่ฟังก์ชั่นลงใน /etc/bash.bashrc หรือ ~ / .bashprofile เพื่อใช้งานในวิธีที่สะดวก

ข้อได้เปรียบของการแก้ปัญหาของฉัน:

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