การนำทางไดเรกทอรีอย่างรวดเร็วใน bash shell


119

ผมอยากจะบ่อยสลับไปมาระหว่างไดเรกทอรีที่อยู่ในเส้นทางที่ไม่เกี่ยวข้องกันโดยสิ้นเชิงเช่นและ/Project/Warnest/docs/~/Dropbox/Projects/ds/test/

แต่ฉันไม่ต้องการพิมพ์cd /[full-path]/ตลอดเวลา มีคำสั่งทางลัดเพื่อสลับไปยังไดเรกทอรีที่ใช้งานได้ก่อนหน้า

ทางออกหนึ่งที่ฉันคิดได้คือการเพิ่มตัวแปรสภาพแวดล้อมให้bash .profileกับไดเรกทอรีที่ใช้บ่อยและcdเพื่อให้พวกเขาใช้ตัวแปรเหล่านั้น

แต่มีวิธีอื่นในการนี้หรือไม่?


ลิงก์สัญลักษณ์อาจมีประโยชน์สำหรับสิ่งนี้ en.wikipedia.org/wiki/…
606723

คำตอบ:


135

หากคุณเพียงสลับไปมาระหว่างสองไดเรกทอรีคุณสามารถใช้cd -เพื่อย้อนกลับไปมาได้


13
สิ่งนี้ทำให้ฉันมีความลึกลับมานานแค่ไหน ขอบคุณมากสำหรับเคล็ดลับที่ยอดเยี่ยมนี้
Mr. Shickadance

3
+1 แน่นอนหนึ่งในรายการโปรดของฉันและเป็นรายการที่ผู้เชี่ยวชาญจำนวนมากพลาดไม่ได้
Michael Durrant

62

มีตัวแปรเปลือกCDPATHในbashและkshและcdpathในzsh:

CDPATH    The search path for the cd command. This is a colon-separated
          list of directories in which the shell looks for destination
          directories specified by the cd command.

ดังนั้นคุณสามารถตั้งค่าใน ~ / .bashrc ของคุณ:

export CDPATH=/Project/Warnest:~/Dropbox/Projects/ds

จากนั้นcd docsและcd testจะนำคุณไปยังไดเรกทอรีแรกที่พบ (ฉันหมายถึงแม้ว่าไดเรกทอรีที่มีชื่อเดียวกันจะมีอยู่ในไดเรกทอรีปัจจุบันCDPATHจะยังคงได้รับการพิจารณาหากCDPATHจะมีไดเรกทอรีเพิ่มเติมที่มีไดเรกทอรีย่อยที่มีชื่อที่กำหนดไว้ไดเรกทอรีแรกจะถูกนำมาใช้)


16
ควรกล่าวว่าโดยทั่วไปคุณจะต้องการให้รายการแรก$CDPATHเป็น.(รายการอย่างชัดเจนเช่นใช้:งานได้) มิฉะนั้นคุณจะพบกับพฤติกรรมแปลก ๆ ที่CDPATHdir มีความสำคัญเหนือไดเรกทอรีในไดเรกทอรีทำงานปัจจุบันซึ่งคุณอาจไม่ต้องการ
jw013

4
ฉันทำสวยมากสิ่งเดียวกัน exportแต่ไม่มี ด้วยวิธีCDPATHนี้จะไม่ถูกส่งออกไปยังสคริปต์ที่อาจมีผลกระทบที่แปลกหรือเป็นอันตราย ดูที่นี่สำหรับการสนทนาและตัวอย่างเพิ่มเติม
Telemachus

"bash และ ksh และ cdpath ใน zsh" ... และใน tcsh (เพียงแค่ตอบคำถามตามนั้นไปยังSuper Userและพบสิ่งนี้ในขณะที่มองหาคำตอบที่คล้ายกันใน SE)
Hennes

นี่คือ POSIX ที่ระบุฉันคิดว่า อย่างน้อย POSIX สำหรับcdอ้างถึง
mikeserv

48

อย่างอื่นคุณอาจลองเป็นเครื่องมือที่เรียกว่าautojump มันเก็บฐานข้อมูลของการโทรไปยังนามแฝง ( jโดยค่าเริ่มต้น) และพยายามทำการตัดสินใจอย่างชาญฉลาดเกี่ยวกับตำแหน่งที่คุณต้องการไป ตัวอย่างเช่นถ้าคุณพิมพ์บ่อย:

j ~/Pictures

คุณสามารถใช้สิ่งต่อไปนี้เพื่อไปที่นั่นได้อย่างรวดเร็ว:

j Pic

มีให้ใช้งานใน Debian และ Ubuntu และรวมอยู่ในแบบต่อผู้ใช้ใน~/.bashrcหรือ~/.zshrcโดยค่าเริ่มต้น


5
Autojump อาจเป็นเครื่องมือที่ดีที่สุดสำหรับสิ่งนี้มันใช้เวลาสักครู่ในการสร้างฐานข้อมูลของ dirs ทั่วไป แต่เมื่อฉันคิดว่าคุณจะพบว่าคุณขาดไม่ได้ ฉันรู้ทุกครั้งที่ฉันใช้คอมพิวเตอร์ของคนอื่นฉันรู้สึกพิการ
quodlibetor

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

ติดตั้งทั้งระบบในระบบใด
ctrl-alt-delor

1
@ Richard มันมีให้ใช้งานเป็นแพ็คเกจ (เช่นapt-get install autojumpใน Ubuntu แต่สำหรับคนอื่น ๆ เป็นเอกสารในหน้าของพวกเขา) สำหรับการติดตั้งทั่วทั้งระบบ แต่ผู้ใช้แต่ละคนจำเป็นต้องโหลดมันลงในสภาพแวดล้อมของเชลล์เพื่อให้สามารถแทนที่ cd เพื่อติดตาม คุณจะไปไหน
nealmcb

สิ่งสำคัญที่จะบอกว่าsource /usr/share/autojump/autojump.shควรจะเพิ่ม ~ / .bashrc สำหรับ autojump ในการทำงาน
Pablo A

39

หากเป็นไดเรกทอรีจำนวนน้อยคุณสามารถใช้pushdหมุนเวียนได้:

# starting point
$ pwd
/Project/Warnest/docs
# add second dir and change to it
$ pushd ~/Dropbox/Projects/ds/test
~/Dropbox/Projects/ds/test /Project/Warnest/docs
# prove we're in the right place
$ pwd
~/Dropbox/Projects/ds/test
# swap directories
$ pushd
/Project/Warnest/docs ~/Dropbox/Projects/ds/test

ไม่เหมือนcd -คุณสามารถใช้นี้มีมากกว่าสองไดเรกทอรี


ติดตามคำแนะนำของ Noach ฉันกำลังใช้สิ่งนี้:

function pd()
{
    if [[ $# -ge 1 ]];
    then
        choice="$1"
    else
        dirs -v
        echo -n "? "
        read choice
    fi
    if [[ -n $choice ]];
    then
        declare -i cnum="$choice"
        if [[ $cnum != $choice ]];
        then #choice is not numeric
            choice=$(dirs -v | grep $choice | tail -1 | awk '{print $1}')
            cnum="$choice"
            if [[ -z $choice || $cnum != $choice ]];
            then
                echo "$choice not found"
                return
            fi
        fi
        choice="+$choice"
    fi
    pushd $choice
}

ตัวอย่างการใช้งาน:

# same as pushd +1
$ pd 1

# show a prompt, choose by number
$ pd
 0 ~/Dropbox/Projects/ds/test
 1 /Project/Warnest/docs
 2 /tmp
? 2
/tmp ~/Dropbox/Projects/ds/test /Project/Warnest/docs

# or choose by substring match
$ pd
 0 /tmp
 1 ~/Dropbox/Projects/ds/test
 2 /Project/Warnest/docs
? doc
/Project/Warnest/docs /tmp ~/Dropbox/Projects/ds/test

# substring without prompt
$ pd test
~/Dropbox/Projects/ds/test /Project/Warnest/docs /tmp

ฯลฯ เห็นได้ชัดว่านี่เป็นเพียงการหมุนผ่านสแต็กและไม่จัดการกับการเพิ่มเส้นทางใหม่ - บางทีฉันควรเปลี่ยนชื่อใหม่


6
Ooh, ฉันรู้เกี่ยวกับpushdและpopdสำหรับการสำรวจเส้นทาง แต่ไม่ว่า pushd สามารถหมุนสิ่งที่ถูกนำมาใช้เพื่อให้ห่างไกล ...
Izkata

14

ฉันใช้aliasbashrc เพื่อทำ cds เหล่านั้น
เช่น:

alias wdoc='cd ~/Project/Warnest/docs'
alias dstest='cd ~/Dropbox/Projects/ds/test'

bashrc เป็นไฟล์เช่น. profile หรือไม่ ที่ฉันต้องการเพิ่มบรรทัดเหล่านั้น?
saiy2k

~/.bashrc/etc/bash.bashrcหรือ ฉันไม่ได้ใช้.profileมาก่อนดังนั้นจึงไม่ทราบความสัมพันธ์ระหว่างพวกเขา :-(
เฟลิกซ์หยาน

สคริปต์ bashrc จะเริ่มทุกครั้งที่คุณเปิดเทอร์มินัล โปรไฟล์พร้อมการเริ่มต้น

เพิ่มบรรทัดเหล่านั้นลงในของฉัน.bash_profileและใช้งานได้ดีมาก .. ขอบคุณ :)
saiy2k

ฉันมีโฟลเดอร์โครงการเฉพาะหลายโฟลเดอร์ที่ฉันไปเป็นประจำนี่เป็นวิธีที่ง่ายที่สุดในการตั้งค่าและดูแลรักษา นอกจากนี้สำหรับฉันมันส่งผลให้มีจำนวนอักขระน้อยที่สุดที่พิมพ์ของโซลูชันทั้งหมดที่นี่ จูบ! :-)
moodboom

11

ฉันพบสคริปต์ (โดยทั่วไปเรียกว่า acd_funch.sh) ที่แก้ไขปัญหานี้ให้ฉัน ด้วยวิธีนี้คุณสามารถพิมพ์cd --เพื่อดู 10 ไดเรกทอรีล่าสุดที่คุณใช้ มันจะมีลักษณะดังนี้:

0  ~/Documents/onedir
1  ~/Music/anotherdir
2  ~/Music/thirddir
3  ~/etc/etc

หากต้องการไป~/Music/thirddirเพียงพิมพ์cd -2

อ้างอิง

หมายเหตุ:สคริปต์นี้ได้รับการตีพิมพ์ในบทความราชกิจจานุเบกษาลินุกซ์ซึ่งมีอยู่ที่นี่: acd_func.sh - ขยายซีดีทุบตีเพื่อให้การแสดงผลและการเข้าถึงความเป็นมาของชื่อไดเรกทอรีเข้าเยี่ยมชม


สคริปต์เดียวกันมากนอกจากนี้ยังได้รับการตีพิมพ์ในลินุกซ์ราชกิจจานุเบกษาฉบับที่ 109 ธันวาคม 2004
Serge Stroobandt

@Dean ลิงก์ไปยังมิวสิควิดีโอและบอกว่า Geocities ปิดแล้ว
somethingSomething

1
@somethingSomething เพิ่มลิงค์สำรอง
คณบดี

ประวัติศาสตร์ grep cd
user2180794

10

ลองcdable_varsตัวเลือกเปลือกในทุบตี shopt -s cdable_varsคุณสลับกับ

export dir1=/some/pathแล้วคุณจะต้องตั้งค่าตัวแปรของคุณ และในที่สุดcd dir1ฯลฯ จากนั้นคุณสามารถใส่ไว้ในของคุณ~/.bashrcเพื่อให้ติด


10

ใช้ "pushd -n " (สมมติว่าคุณใช้ bash)

เพิ่มใน ~ / .bashrc ของคุณ:

pushd -n /Project/Warnest/docs/
pushd -n ~/Dropbox/Projects/ds/test/

แล้ว

cd ~ คือบ้านของคุณ

cd ~1 คือ ~/Dropbox/Projects/ds/test/

cd ~2 คือ /Project/Warnest/docs/

คุณสามารถใช้~1, ~2ฯลฯ ~ในทางเดียวกันว่าเป็น


7

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

หากเป็นรายการเล็ก ๆ คงที่การตั้งค่านามแฝงง่าย (ตามที่ Felix Yan แนะนำ) จะใช้งานได้ง่ายที่สุด

หากคุณกำลังมองหาโซลูชันทั่วไป (เช่นไดเรกทอรีที่แตกต่างกันมากการเปลี่ยนแปลงตลอดเวลา) ฉันจะใช้ pushd และ popd (ตามที่แนะนำไร้ประโยชน์) โดยส่วนตัวแล้วฉันพบว่า pushd / popd เริ่มต้นนั้นใช้งานยากโดยเฉพาะอย่างยิ่งเมื่อคุณเริ่มสลับระหว่างโฟลเดอร์ต่างๆ อย่างไรก็ตามฉันเขียน tweaks สองสามอย่างที่ทำให้ฉันง่ายขึ้นมาก เพิ่มสิ่งต่อไปนี้ใน bashrc ของคุณ:

alias dirs='dirs -v'
pd () 
{ 
    if [ "$1" ]; then
        pushd "${1/#[0-9]*/+$1}";
    else
        pushd;
    fi > /dev/null
}
  • ใช้pd(เป็นรูปแบบที่สั้นกว่าpushd) เพื่อข้ามไปยังโฟลเดอร์ใหม่โดยจดจำตำแหน่งที่คุณอยู่
  • ใช้dirsเพื่อดูรายการไดเรกทอรีที่บันทึกไว้
  • ใช้pd 3เพื่อข้ามไปยังไดเรกทอรีหมายเลข 3

ตัวอย่างการใช้งาน:

$ PS1='\w\$ '   ## just for demo purposes
~$ pd ~/Documents/data
~/Documents/data$ pd ../spec
~/Documents/spec$ pd ~/Dropbox/Public/
~/Dropbox/Public$ pd /tmp
/tmp$ pd /etc/defaults/
/etc/defaults$ dirs
 0  /etc/defaults
 1  /tmp
 2  ~/Dropbox/Public
 3  ~/Documents/spec
 4  ~/Documents/data
 5  ~
/etc/defaults$ pd 2
~/Dropbox/Public$ dirs
 0  ~/Dropbox/Public
 1  ~/Documents/spec
 2  ~/Documents/data
 3  ~
 4  /etc/defaults
 5  /tmp
~/Dropbox/Public$ pd 4
/etc/defaults$ dirs
 0  /etc/defaults
 1  /tmp
 2  ~/Dropbox/Public
 3  ~/Documents/spec
 4  ~/Documents/data
 5  ~
/etc/defaults$ pd 3
~/Documents/spec$ popd
~/Documents/data ~ /etc/defaults /tmp ~/Dropbox/Public
~/Documents/data$ 

6

ต่อไปนี้ปรากฏว่าสามารถใช้งานได้ในกรณีเดียวที่ฉันทดสอบและคุณสามารถวางชื่อไดเรกทอรีเป็น symlink ใน ~ / Bookmarks:

mkdir "$HOME/Bookmarks"
ln -s /tmp "$HOME/Bookmarks/testdir"

function ccd() { cd $(readlink "$HOME/Bookmarks/$1") ; }

ccd testdir && echo $PWD
# gives /tmp

ฟังก์ชัน ccd () นั้นจำเป็นต้องพิมพ์ใน terminal prompt หรือที่อื่น ๆ ? กรุณาอธิบายได้ไหม
saiy2k

1
@ saiy2k: ขอโทษใช่ functionสายที่จะเข้าสู่ .bashrc ของคุณ (คุณสามารถพิมพ์ใน terminal ของคุณเพื่อทดสอบ แต่มันจะหายไปเมื่อคุณปิดหน้าต่างที่) เส้นก่อนที่จะตั้งค่ากรณีทดสอบของ "testdir" กลายเป็นชื่อหา/tmpและ บรรทัดสุดท้ายคือการทดสอบเพื่อดูว่ามันใช้งานได้หรือไม่
Ulrich Schwarz

6

คุณสามารถทำเลวร้ายยิ่งกว่าพยายามJ2

จาก README:

ใช้เวลามากมายในการทำไดเร็กตอรี่ทรีซับซ้อน?

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

ฉันใช้มันอย่างกว้างขวาง & แนะนำ


5

ฉันขอแนะนำให้ใช้zshซึ่งเป็นแท็บ TAB ที่ดีมากสำหรับไดเรกทอรีไฟล์และตัวเลือกสำหรับโปรแกรม cli ส่วนใหญ่

ฉันใช้เชลล์นั้นมาหลายปีแล้วและฉันจะพลาดฟังก์ชั่นนี้ถ้ามันหายไป การเขียนสคริปต์ zsh นั้นสนุกมากเช่นกันพร้อมกับlinersจำนวนมากที่สามารถช่วยคุณได้ทุกวัน


ไม่จำเป็นต้องเปลี่ยนเป็น zsh สำหรับการทำ TAB เนื่องจาก bash จะเหมือนกันหมด สำหรับฟังก์ชั่นอื่น ๆ อาจจะ แต่ไม่ใช่สำหรับสิ่งนี้
Peer Stritzinger

1
@PeerStritzinger Bash นำเสนอฟังก์ชั่นการใช้งานใน BASH 4.0 แต่เมื่อเทียบกับ zsh มันยังค่อนข้างไกล การพูดว่า "เหมือนกันทุกอย่าง" นั้นไม่ถูกต้องอย่างแน่นอน
polemon

zsh ก็คือübershell ceartainly แต่สำหรับการกรอกข้อมูลในแท็บไม่จำเป็นต้องเปลี่ยน (คำถามถูกถามเพื่อทุบตี) นอกจาก bash 4.0 ได้เปิดตัวเมื่อประมาณ 3 ปีที่ผ่านมา ...
Peer Stritzinger

5

จากประสบการณ์ของฉันการเร่งความเร็วสูงสุดในการนำทางในเชลล์คือการใช้ฟังก์ชันการค้นหาประวัติ ใน Bash คุณสามารถค้นหาย้อนหลังในประวัติคำสั่งโดยกดCtrl+ Rและพิมพ์ในรูปแบบบางอย่าง รูปแบบนั้นจะถูกจับคู่กับรายการก่อนหน้าในประวัติของคุณ - อาจเป็นcdคำสั่งหรือการดำเนินการอื่น ๆ - และทำตามคำแนะนำเมื่อคุณพิมพ์ เพียงกด Enter เพื่อเรียกใช้คำสั่งที่แนะนำอีกครั้ง สิ่งนี้เรียกว่าreverse-search-historyใน Bash และฉันรักมัน มันช่วยให้ฉันกดแป้นจำนวนมากและสำรองหน่วยความจำภายในของฉัน

มันเป็นสิ่งที่ดีเพราะคุณจะต้องจำบางส่วนที่มีขนาดเล็กของคำสั่งที่ชอบDropหรือWaที่จะแยกแยะความแตกต่างระหว่างทั้งสองรายการประวัติและcd ~/Dropbox/Projects/ds/test/cd /Project/Warnest/docs/


5

ฉันยังใช้ชื่อแทนเหล่านี้ (เพิ่มใน ~ / .bashrc):

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'

มันเร็วกว่ามากที่จะไปที่ไดเรกทอรีด้านบนกับพวกเขา (แต่มันแก้เพียงครึ่งหนึ่งของการนำทาง)


1
นี่เป็นนามแฝงที่มีประโยชน์ แต่ฉันไม่แน่ใจว่าพวกเขาจะตรงกับความต้องการของ OP หรือไม่ คุณอาจพิจารณาขยายคำตอบของคุณเพื่อแนะนำว่าสิ่งเหล่านี้อาจเป็นประโยชน์โดยตรงสำหรับปัญหาของ OP อย่างไร
HalosGhost

4

หากคุณใช้ zsh:

  • คุณไม่ต้องพิมพ์cdเพียงพิมพ์เส้นทางไดเรกทอรี ( /foo/bar/baz<Enter>เท่ากับcd /foo/bar/baz<Enter>)

    ต้องการauto_cdตัวเลือกที่จะตั้งค่า

  • คุณสามารถขยายพา ธ แบบย่อด้วยTabคีย์ได้ ( /u/sh/pi<Tab>ขยายเป็น/usr/share/pixmapsใช้ได้กับชื่อไฟล์ด้วย)

3
Bash 4 ได้รับshopt -s autocdดังนั้นมันจึงไม่ใช่ความดี zsh-only อีกต่อไป
Gilles

4

มีเครื่องมือที่ค่อนข้างดีสำหรับการเปลี่ยนแปลงไดเรกทอรีอย่างรวดเร็ว:

xd - ตัวเปลี่ยนไดเรกทอรีด่วน eXtra http://xd-home.sourceforge.net/xdman.html

บิตที่น่าอึดอัดใจคือคุณต้องแมปมันในโปรไฟล์ทุบตีหรือคล้ายกันเพราะมันจะส่งออกเฉพาะไดเรกทอรี

# function to do `cd` using `xd`
# -g turns generalized directory search command processing on
# which improves the whole thing a bit
f() 
{
        cd `/usr/bin/xd -g $*`
}

คุณสามารถทำสิ่งต่าง ๆ เช่น:

# change to /var/log/a* (gives you a list to choose from)    
f vla
# to skip the list and go directly to /var/log/apache2
f vlapach

เปลี่ยนฟังก์ชั่นเป็นf() { cd "$(xd -g "$@")"; }จัดการช่องว่างไดเรกทอรีและช่องว่างในอาร์กิวเมนต์อย่างเหมาะสมxd(คุณอาจไม่ต้องการพา ธ ) หากคุณไม่เคยใช้xdในลักษณะอื่นคุณสามารถทำได้xd() { cd "$(command xd -g "$@")"; }(หรือใช้/usr/bin/xdแทนcommand xd- คุณสามารถทำงานได้ตลอดเวลาcommand xd …หากคุณต้องการหลีกเลี่ยง)
Adam Katz

4

คุณไม่ควรพิมพ์เส้นทางแบบเต็มในเชลล์เลย คุณสามารถใช้:

soffice /P*/W*/*/mydoc*

แทน

soffice /Project/Warnest/docs/mydoc.odt

1
นี่เป็นเหมือนการทำแท็บ แต่แย่กว่านั้นในทุกด้าน
Michael Mrozek

คุณไม่สามารถทำสิ่งนี้ได้ด้วยแท็บที่ดำเนินการด้วยการกดปุ่มจำนวน euqal ยกเว้นว่า Project เป็นไฟล์ที่ขึ้นต้นด้วย P เท่านั้นและคุณต้องรอให้เสร็จในแต่ละครั้งโดยใช้ * คุณไม่จำเป็นต้องรอ
gena2x

ฉันคิดว่าคุณมีไว้ข้างหลัง - คุณทำไม่ได้P*เว้นแต่ว่า Project เป็นไฟล์เดียวที่เริ่มต้นด้วยความสมบูรณ์ของ Tab Tab สามารถวนรอบ (โดยค่าเริ่มต้นในเชลล์ส่วนใหญ่คุณต้องรีบแท็บเป็นmenu-completebash) และแก้ไขทันทีในกรณีง่าย ๆ เช่นนี้ไม่มีการรอคอยเลย
Michael Mrozek

เกี่ยวกับ 'คุณทำไม่ได้' - คุณทำได้ลองทำคุณพลาดจุดทั้งหมดถ้าคุณคิดว่าคุณทำไม่ได้ ลอง echo / u * / b * / g ++
gena2x

1
ฉันเข้าใจสิ่งที่คุณหมายถึงมันจะเร็วขึ้นตราบใดที่คุณแน่ใจว่าคุณพิมพ์เส้นทางที่ไม่คลุมเครือ แต่สิ่งที่/P*/W*/*/mydoc*ดูเหมือนว่ามันจะทำงานได้ดีจนกระทั่งวันหนึ่งคุณเกิดไฟล์ใหม่ที่ตรงกับ glob นั้นและทันใดนั้นคุณก็จบ เปิดขึ้นทั้งสองในครั้งเดียว /u*/*/g++เป็นตัวละครไม่กี่อย่างน่าประทับใจ แต่ไม่มีอะไรหวังว่าคนอื่นในใด ๆ ของโฟลเดอร์ย่อยใด ๆ ของโฟลเดอร์รากของฉันเริ่มต้นด้วยการตั้งชื่อu g++(สำหรับการประนีประนอมที่ดีในบางกระสุนคุณสามารถใช้แท็บเพื่อขยาย globs แบบที่คุณไปได้)
Michael Mrozek

3

นอกจากนี้ยังOLDPWDมีตัวแปรสภาพแวดล้อมที่อ้างอิงกับ IEEE 1003.1 (POSIX) ซึ่งควรปรับปรุงด้วยไดเรกทอรีการทำงานก่อนหน้าทุกครั้งที่cdเปลี่ยนไดเรกทอรีการทำงาน (สำหรับคนที่อยากรู้อยากเห็นบรรทัด 80244 ของหน้า 2506 ของ IEEE 1003.1-2008)


3

นอกจากนี้ยังมีแอพ "wcd" ที่สร้างขึ้นเป็นพิเศษสำหรับสิ่งนี้ (ส่งไปยัง cygwin ด้วยเช่นกัน) คุณสามารถสร้างทางลัดบุ๊กมาร์กของ dirs ได้ ยังรองรับไวล์การ์ด การอ่าน man page & docs ใน / usr / share / wcd น่าจะช่วยได้มาก

http://manpages.ubuntu.com/manpages/hardy/man7/wcd.7.html


3

cdargs เป็นเครื่องมือที่มีประสิทธิภาพมากที่สุดสำหรับการทำบุ๊กมาร์กไดเรกทอรี: http://www.youtube.com/watch?v=uWB2FIQlzZg


ผลิตภัณฑ์นี้เกี่ยวข้องกับคุณหรือไม่?
Kazark

ขอบคุณที่ชี้นำฉันไปที่ cdargs เพียงแค่sudo apt-get cdargsอูบุนตู BTW วิดีโอ youtube นั้นแย่มาก แต่เครื่องมือนี้ยอดเยี่ยม
DavidG

3

ลอง fastcd ( https://github.com/frazenshtein/fastcd ) ตั้งค่า hook ที่บันทึกไดเรกทอรีที่เข้าเยี่ยมชมจากทุบตี และตั้งค่าสคริปต์เป็นนามแฝง "j" ซึ่งจะแสดงไดเรกทอรีที่คุณเยี่ยมชมล่าสุดพร้อมความสามารถในการ cd อย่างรวดเร็ว (เริ่มพิมพ์เพื่อกรองไดเรกทอรี) การแก้ไข. bashrc จำเป็นต้องใช้เพื่อทำให้นามแฝง "j"

กำลังรับเครื่องมือ

cd ~; mkdir Soft; cd Soft
git clone https://github.com/frazenshtein/fastcd

ติดตั้งโมดูลที่ต้องการ

pip install --user urwid

ส่งไฟล์ set.sh ไปยัง bashrc ของคุณ

echo -e "\nsource /home/$USER/Soft/fastcd/set.sh\n" >> ~/.bashrc

และอัปเดต bashrc

source ~/.bashrc

จากนั้นพิมพ์ "j" ในคอนโซล


มันทำงานอย่างไร หากเป็นชื่อแทนเครื่องมือนี้จะทำอะไรให้คุณโดย.bashrcไม่แก้ไขด้วยตนเอง
G-Man

มันเปิดตัว daemon ที่บันทึกการเยี่ยมชมไดเรกทอรีใน ~ / .fastcd สำหรับเชลล์ที่เปิดตัว "j" เปิดตัวเครื่องมือที่แสดงไดเรกทอรีที่เยี่ยมชมล่าสุดพร้อมความสามารถในการ cd อย่างรวดเร็ว การแก้ไข. bashrc จำเป็นต้องใช้เพื่อทำให้นามแฝง "j" คุณสามารถดูซอร์สโค้ดสำหรับข้อมูลเพิ่มเติมฉันเดา
Sam Toliman

ขอบคุณสำหรับการตอบสนองที่รวดเร็ว นี่คือการเรียงลำดับของข้อมูลที่ควรอยู่ในคำตอบ โปรดแก้ไขคำตอบของคุณเพื่อรวมข้อมูลนี้
G-Man

3

ฉันมีคำถามเดียวกันและเป็นครั้งแรกที่พบคำตอบนี้ ฉันติดตั้งยูทิลิตี้ z ( https://github.com/rupa/z )

นี่คือสิ่งที่คุณมองหาเพราะ z เรียนรู้จากคำสั่ง cd ของคุณและติดตามไดเรกทอรีตามหลักการfrecency (บ่อยและล่าสุด) ดังนั้นหลังจากที่คุณทำทั้งสองคำสั่ง cd ครั้งเดียวคุณสามารถทำได้ดังนี้:

z docs
z ds

เพื่อข้ามไป/Project/Warnest/docs/และ~/Dropbox/Projects/ds/test/ตามลำดับ อาร์กิวเมนต์ของ z เป็น regexes ดังนั้นคุณไม่จำเป็นต้องพิมพ์ชื่อโฟลเดอร์แบบเต็ม


3

อัปเดต (2016):ตอนนี้ฉันใช้FASDสำหรับสิ่งนี้ซึ่งอนุญาตให้ค้นหาแบบฟัซซี่จากไดเรกทอรีล่าสุดของคุณ


ฉันได้สร้างเครื่องมือสำหรับสิ่งนี้ในรูบี ช่วยให้คุณใช้ไฟล์ YAML เพื่อประกาศโครงการของคุณ

ฉันได้เขียนบทความเล็กน้อยเกี่ยวกับที่นี่: http://jrnv.nl/switching-projects-terminal-quickly/

ฉันได้โพสต์แหล่งที่มาใน GitHub: https://github.com/jeroenvisser101/project-switcher


2

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


2

คุณสามารถใช้exportเพื่อกำหนดเส้นทางไดเรกทอรีของคุณให้กับตัวแปรแล้วอ้างอิงได้

export dir1=/Project/Warnest/docs/
export dir2= ~/Dropbox/Projects/ds/test/
cd $dir1
cd $dir2

ใช่มันเพียงพอสำหรับผู้ที่ชื่นชอบไม่กี่คน ไม่จำเป็นต้องติดตั้งโปรแกรมอรรถประโยชน์อื่น ๆ เพียงแค่ใส่exportข้อความในของคุณ~/.bashrcและพวกเขาจะพร้อมใช้งานเสมอ
wisbucky

1

ข้อเสนอแนะบางอย่างที่นี่:

แนวคิดส่วนใหญ่ฉันจะเพิ่มชื่อแทนในไฟล์. profile

vi ~/.profile
alias dir1='cd /myhome/onedir'
alias dir2='cd /jimmy/anotherdir'

จากนั้นใช้ $ dir1 หรือdir2สามารถ cd

หากคุณมักจะเปลี่ยนในสอง dirs เท่านั้น ใช้cd -จะสลับระหว่างพวกเขา


1

screenวิธีการแก้ปัญหาที่ผมใช้สำหรับสถานการณ์นี้คือ หน้าจอเริ่มต้นและสร้างหน้าต่างสำหรับแต่ละไดเรกทอรีด้วยC-a cและนำทางไปที่นั่น เปลี่ยนระหว่างหน้าต่าง / ไดเรกทอรีที่มีหรือC-a n ชื่อหน้าต่างด้วยC-a p C-a Aจากนั้นคุณสามารถเปิดรายการหน้าต่างด้วยC-a "และนำทางโดยใช้หมายเลขหรือชื่อหน้าต่าง เนื่องจากเป็นscreenคุณสามารถแยกออกจากเซสชันการบันทึกพื้นที่ทำงานของคุณและแนบใหม่ในภายหลังด้วยการตั้งค่าเดียวกัน


1

ดูเหมือนว่าสิ่งที่คุณต้องการนั้นเป็นไฟล์โครงการสำหรับเวิร์กโฟลว์ของคุณ ด้วยไดเรกทอรีที่เป็นของกิจกรรมของคุณเช่นใน IDE การเขียนโปรแกรม ลองใช้เครื่องมือนำทาง Zshและเครื่องมือที่n-cdนั่น มันจะช่วยให้คุณสามารถนำทางข้ามโฟลเดอร์ที่เยี่ยมชมล่าสุดและกำหนดHotlistด้วยไดเรกทอรีที่คุณเลือก:

n-CD

n-cd สามารถรวมกับคีย์ผสมกับ:

zle -N znt-cd-widget

bindkey "^ T" znt-cd-widget


1

TL; DR

  1. ใช้Fishสำหรับเปลือกโต้ตอบที่ช่วยให้คุณทันที ( fish> zsh> bash)
  2. ใช้POSIX/ Bashสำหรับการเขียนสคริปต์ที่เป็นไวยากรณ์การสนับสนุนอย่างกว้างขวางมากที่สุด ( POSIX> Bash> Zsh> Fish)

เปลือกหอย

มีการทดสอบเปลือกแตกต่างกันที่นี่เป็นข้อเสนอแนะของฉัน (ในลำดับของการทดสอบ / การยอมรับ)

  • Bash:
    • การทำให้สมบูรณ์อัตโนมัติ: พื้นฐาน;
    • การขยายเส้นทาง: ไม่มี;
    • สคริปต์: ยอดเยี่ยม
  • Zsh+ oh-my-zsh:
    • การทำให้สมบูรณ์อัตโนมัติ: ดี (ขี่จักรยานผ่าน);
    • การขยายเส้นทาง: ใช่ ( cd /e/x1cd /etc/X11/);
    • สคริปต์: ดี
  • Fish+ oh-my-fish(ปัจจุบัน) เป็นสิ่งที่ดีที่สุดนอกกรอบ:
    • เติมอัตโนมัติ: ตัวเลือกเนทีฟและสนับสนุน;
    • การขยายเส้นทาง: ใช่;
    • สคริปต์: ความแตกต่างมากเกินไปจาก POSIX- เข้ากันได้

ใช้นามแฝงที่มีความหมาย

ทุกเชลล์สามารถขยายได้โดยใช้functionและaliasนี่คือสิ่งที่ฉันใช้เกี่ยวข้องกับปัญหาของคุณ (เข้ากันได้กับ POSIX):

back () {  # go to previous visited directory
        cd - || exit
}

up () {  # go to parent directory
        cd ..|| exit
}

มีพื้นฐาน แต่มีความหมายจริงๆง่ายต่อการจดจำและเติมข้อความอัตโนมัติ

รู้ว่าเปลือกของคุณ

กำหนดค่าCDPATHเพื่อเพิ่มไดเรกทอรีที่ใช้มากที่สุดของคุณ (เช่น~/projects/, /etc/init.d/) เพื่อให้คุณได้อย่างรวดเร็วสามารถข้ามไปยังพวกเขา

ดูคำตอบสำหรับ manatwork mroe CDPATHรายละเอียดเกี่ยวกับ

Hangout และอ่าน


เมื่อเรียกใช้ฟังก์ชันเชลล์exitคุณจะออกจากเชลล์แบบโต้ตอบ "นามแฝงที่มีความหมาย" เหล่านั้นอาจเป็นalias back='cd -'และalias up='cd ..'- แต่ไม่ต้องกังวลคำสั่งเหล่านั้นจะไม่ส่งคืนเท็จ (ไม่มีไดเรกทอรีก่อนหน้าหรือไม่มันจะส่งคุณกลับบ้าน! อยู่ในรากแล้วหรือไม่มันไม่ใช่ -op!) และดังนั้นคุณจะไม่ออก . นอกจากนี้ให้พิจารณาalias back='cd $OLDPWD'(จดเครื่องหมายคำพูดเดี่ยว) เนื่องจากไม่มีเอาต์พุตใด ๆ ( cd -บอกคุณว่ากำลังส่งคุณอยู่ที่ไหนซึ่งไม่จำเป็นเนื่องจากพรอมต์ของคุณมีข้อมูลนั้น)
Adam Katz

1

ancเป็นเครื่องมือบรรทัด cmd (ย่อมาจาก anchor) ที่เก็บบุ๊กมาร์กของไดเรกทอรี (จนถึงตอนนี้ผ่านการทดสอบโดยใช้ bash เท่านั้น)

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

anc a /Project/Warnest/docs/ ~/Dropbox/Projects/ds/test/

เพิ่มทั้งสองไดเรกทอรีลงในรายการจุดยึด (คิดว่าคั่นหน้า)

ตอนนี้ถ้าคุณต้องการข้ามไปยัง/Project/Warnest/docs/ที่ใดก็ได้บนประเภทระบบของคุณ:

anc Warn

และหากคุณต้องการข้ามไป~/Dropbox/Projects/ds/test/พิมพ์:

anc ds test

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

anc i

เริ่มโหมดโต้ตอบที่แสดงรายการคั่นหน้าทั้งหมดตามหมายเลขดังนั้นสิ่งที่คุณต้องพิมพ์คือหมายเลข

หากคุณพิมพ์:

anc Pro[TAB]

รายการที่ตรงกับบุ๊กมาร์กทั้งหมด (ในกรณีของคุณทั้งสองบุ๊กมาร์ก) จะปรากฏขึ้นและคุณสามารถเลือกจากรายการโดยใช้ปุ่มลูกศรนี่เป็นวิธีที่รวดเร็วและใช้งานง่าย

รับ anc ที่หน้า github ของโครงการ: https://github.com/tobimensch/anc

นอกจากนี้ยังมี README พร้อมตัวอย่างการใช้งาน

การเปิดเผยแบบเต็ม: ฉันเป็นผู้เขียนสคริปต์นี้ ฉันหวังว่าบางคนจะพบว่ามีประโยชน์

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