เทียบเท่านามแฝงสำหรับลิงก์สัญลักษณ์?


18

ฉันพบว่าตัวเองต้องการข้ามไดเรกทอรีบางอย่างในโฟลเดอร์บ้านของฉันบ่อยและเบื่อเขียน ฉันต้องการวิธีที่รวดเร็วกว่าซึ่งเป็นลิงก์แบบดั้งเดิม

อย่างไรก็ตามฉันไม่ต้องการที่จะทำให้ไดเรกทอรีบ้านของฉันยุ่งเหยิงด้วยลิงค์สัญลักษณ์มากมาย ฉันจะสร้างบาง~/links/ไดเรกทอรีและถ่วงมันมีการเชื่อมโยงสัญลักษณ์ แต่ก็ยังคงเป็นที่น่าเกลียด นอกจากนี้ฉันอาจต้องการสร้างลิงก์สัญลักษณ์ซึ่งเปลี่ยนแปลงในแต่ละวัน (กำหนดใน. bashrc) เพื่อข้ามไปยังไดเรกทอรีวันปัจจุบัน

มีวิธีในการนามแฝงลิงก์สัญลักษณ์อย่างมีประสิทธิภาพหรือไม่สร้างสิ่งที่จะได้รับการยอมรับว่าเป็นลิงก์สำหรับการนำทางอย่างรวดเร็ว แต่จะไม่ปรากฏขึ้นจริงเมื่อฉันทำlsโฮมไดเรกทอรีของฉันและจะไม่เกินเซสชันปัจจุบันหรือไม่


4
คุณอาจต้องการดู pushd และ popd
Rui F Ribeiro

ฉันพบว่าแนวทางของ Jeroen Janssen สามารถปรับเปลี่ยนได้และต้นทุนต่ำสำหรับความต้องการที่แน่นอนนี้: jeroenjanssens.com/2013/08/16/…
Theophrastus

2
คุณใช้เปลือกอะไร
Gilles 'ดังนั้นหยุดความชั่วร้าย'

@Theophrastus Heh - โดยทั่วไปแล้วสิ่งที่ฉันนำมาใช้ใหม่ไม่ได้ค่อนข้างหรูหราในคำตอบของฉัน
mattdm

3
ไม่ว่าสิ่งที่คุณกำลังมองหา แต่ยังคงมีประโยชน์เมื่อกระโดดไปมาระหว่างผู้อำนวยการสองคน: ก่อนหน้านี้cd -จะcdเข้าไปในไดเรกทอรีสุดท้าย ดังนั้นหากคุณทำสองครั้งคุณจะกลับไปที่ที่คุณเริ่ม ... ดีมากสำหรับสถานการณ์ "โอ้ฉันลืมแก้ไข someFile.txt ที่ตำแหน่งก่อนหน้า" => เพียง: cd -แก้ไข someFile.txtcd -
dingalapadum

คำตอบ:


12

คุณสามารถใช้ความสมบูรณ์ของแท็บ ตามค่าเริ่มต้นในลีนุกซ์รุ่นอื่น ๆ , bash จะถูกตั้งค่าเพื่อให้เมื่อคุณกดปุ่ม [TAB], คุณจะได้รับรายชื่อการแข่งขันที่เป็นไปได้, หรือหากมีการแข่งขันเพียงครั้งเดียว สำหรับ cd นี่เป็นรายการของไดเรกทอรีย่อยของไดเรกทอรีการทำงานปัจจุบัน คุณสามารถเขียนทับได้ แต่ฉันแนะนำให้สร้างนามแฝงแทนเช่นjd"jump directory":

alias jd=cd

จากนั้นกำหนด "บุ๊กมาร์ก" ที่คุณต้องการให้เป็น jd ดูหน้า bash man เพื่อดูตัวเลือกเพิ่มเติมมากมาย (รวมถึงการสร้างผลลัพธ์อัตโนมัติในทันทีจากคำสั่งหรือฟังก์ชัน) แต่วิธีที่ง่ายที่สุดคือรายการคำด้วย-W:

สมบูรณ์ -W "/ srv / www ~ / tmp ~ / work" jd

ทีนี้พิมพ์jdและกด [TAB] แล้วคุณจะเห็น "บุ๊กมาร์ก" ของคุณ พิมพ์ส่วนที่ไม่ชัดเจนใด ๆ แล้วกด [TAB] เพื่อทำให้เสร็จ (ในข้างต้นการ~ขยายไปยังโฮมไดเร็กตอรี่ของฉันดังนั้น [TAB] แรกให้ฉัน/และถ้าฉันกดwและ [TAB] อีกครั้ง/srv/wwwจะถูกกรอก)

แน่นอนใส่ในนี้~/.bash_profileเพื่อให้มันคงอยู่

หรือเราสามารถนำสิ่งนี้ไปสู่อีกระดับ สร้างไดเรกทอรี~/.shortcuts- โดยเริ่มจากจุดมันจะถูกซ่อนไว้และไม่ยุ่งกับการสร้างไดเรกทอรีบ้านที่ดีของคุณและเติม symlink ให้กับไดเรกทอรีที่คุณต้องการ จากนั้นใส่สิ่งนี้ลงใน ~ / .bash_profile ของคุณ:

_list_shortcuts() 
{ 
    COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
    cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd

กำหนดนี้เสร็จซับซ้อนกว่าเล็กน้อยใน fuction _list_shortcutsที่จะสร้างรายชื่อและทำให้เป็นฟังก์ชั่นมากกว่านามแฝงง่ายเนื่องจากเราต้องการให้ทำหน้าที่แตกต่างจากjd cdการ-Pตั้งค่าสถานะเพื่อcdทำให้การแก้ไข symlink ดังนั้นทุกอย่างกลายเป็นเวทมนตร์โปร่งใส ชื่อทางลัดของคุณไม่จำเป็นต้องตรงกับเป้าหมาย

ดังนั้น:

$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm  8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work

และสำหรับแฟนซีเพิ่มเติมให้ทำjdรายการทางลัดทั้งหมดของคุณเมื่อดำเนินการโดยไม่มีพารามิเตอร์ใด ๆ :

jd()
{
    if [[ -z "$1" ]]; then
      (cd ~/.shortcuts; stat -c '%N' *)
    else
      cd -P ~/.shortcuts/$1
    fi
}

หมายเหตุ: ฉันใช้compgen -W $( cmd )แทนcompgen -C 'cmd'เพราะสิ่งหลังไม่ได้ผลสำหรับฉันและฉันไม่เข้าใจว่าทำไม นั่นอาจเป็นคำถามใหม่ของฉันเอง :)


น่าสนใจมาก. แม้ว่าหนึ่ง catch มันยังคงต้องพิมพ์ลิงก์เต็มหรืออย่างน้อยก็พอที่จะกลายเป็นลิงค์ที่ไม่คลุมเครือก่อนที่ฉันจะสามารถใช้ jd ได้ มีวิธีใดในการเพิ่มชื่อแทนในคำสั่ง jd เพื่อย่อให้สั้นลง? หรือทำให้มันสัมพันธ์กับไดเรกทอรีที่ฉันสามารถจัดเก็บลิงก์สัญลักษณ์ที่ฉันคิดว่า
dsollen

@dsollen ดูอัปเดต :)
mattdm

มันทำงานได้อย่างสมบูรณ์แบบ ในความซื่อสัตย์ทั้งหมดฉันไม่ได้คาดหวังคำตอบที่ดีสำหรับคำถามนี้ แต่นี่เป็นสิ่งที่ฉันต้องการ ฉันคาดว่าจะใช้งานได้เล็กน้อยและรู้สึกสะอาดพอที่จะเพิ่มลงในรายการสิ่งที่ฉันแก้ไขเมื่อใดก็ตามที่ฉันได้รับ VM ใหม่ (ฉันยังมีวิธีอัตโนมัติในการโคลนการเปลี่ยนแปลงสภาพแวดล้อมมาตรฐานของฉันไปยัง vm lol ใหม่) ขอบคุณมาก. ในบางจุดที่เมื่อฉันมีเวลาว่างมากขึ้นฉันจะคิดออกว่าไวยากรณ์สำหรับ COMPREPLY ทำงาน;)
dsollen

18

นามแฝงเชลล์มีคุณสมบัติที่คุณสามารถทำ (บางส่วน) ชื่อเสร็จบนพวกเขา (มักจะผูกพันกับtab) หรือคุณสามารถใช้CDPATHคุณสมบัตินี้ซึ่ง "เร็ว ๆ นี้" (ภายใน 5-6 ปีที่ผ่านมา) ได้รับการปรับปรุงเพื่อรองรับการกรอกชื่อ หากสิ่งนั้นเหมาะกับคุณมันจะมีความได้เปรียบที่สิ่งที่คุณพิมพ์คือชื่อจริงของไดเรกทอรีแทนที่จะเป็นตัวช่วยจำ

ตามคู่มือทุบตี

CDPATH
รายการไดเร็กทอรีที่คั่นด้วยโคลอนที่ใช้เป็นพา ธ การค้นหาสำหรับcdคำสั่ง builtin

อ่านเพิ่มเติม:


ไม่ทราบเกี่ยวกับCDPATHตัวแปรสภาพแวดล้อมขอบคุณ ฉันอาจเพิ่มของฉันgit_reposไดเรกทอรีตัวแปรที่ ....
Wildcard

16

สำหรับไดเรกทอรีที่คุณใช้บ่อย แต่ไม่เปลี่ยนทุกวันตัวเลือกอื่นคือเพียงแค่มีหลายaliasคำสั่งใน.bashrcไฟล์ของคุณ:

alias cdo="cd /u01/app/oracle"
alias cdw="cd /var/www/html" 

เพื่อนมีประมาณ 50 คน ฉันมีกำมือหนึ่ง ง่ายและรวดเร็ว แค่

cdo

เพื่อเปลี่ยนไดเรกทอรีเป็น / u01 / app / oracle


จริง ฉันใช้กลไกนี้มาตั้งแต่ต้นปี 1990
wallyk

7

ผมขอแนะนำและpushdpopd

ฉันเองพบว่ามีประโยชน์เมื่อทำการพัฒนา / อ่านซอร์สโค้ดเมื่อมีหลายไดเรกทอรีที่เกี่ยวข้อง

พวกเขาใช้โครงสร้างสแต็ค / LIFO อย่างมีประสิทธิภาพโดยที่คุณผลักไดเรกทอรี ( pushd) และคำสั่งไดเรกทอรี POP ถัดไป ( popd) จะดึงข้อมูล

ดังนั้นเมื่ออยู่ใน dir คุณจะต้อง:

pushd .

และเมื่อคุณต้องการเรียกคืนคุณต้องทำ

popd

คุณสามารถดำเนินการหลายรายการpushdและดำเนินการในpopdภายหลังเพื่อกลับไปยังไดเรกทอรี

ฉันจะทิ้งลิงค์ไว้ที่นี่

http://www.eriwen.com/bash/pushd-and-popd/


1
นี่เป็นวิธีแก้ปัญหาที่ฉันใช้ด้วยยกเว้นว่าฉันไม่ค่อยได้ใช้popdเท่าไหร่ ผมของฉันกรอกdirsรายการ (ซึ่งเป็นประชากรโดยpushdคำสั่ง) กับไดเรกทอรีทั้งหมดที่ฉันต้องการที่จะเยี่ยมชม / pushd +1ทำงานในก้อนของเวลานั้นแล้วผมทำงาน จากนั้นฉันสามารถวนผ่านไดเร็กตอรี่อย่างง่าย ๆ!puซึ่งเร็วมาก (โปรดทราบว่าทั้ง Ubuntu และ CentOS pushdเป็นคำสั่งเดียวที่มีให้ในการติดตั้งใหม่ทั้งหมดที่เริ่มต้นด้วยpu)
Wildcard

3

คุณสามารถทำให้พวกเขาเป็นตัวแปรในตัวคุณ~/.bashrcแล้วพวกมันก็อยู่$ห่างออกไป

$ cat ~/.bashrc
if [ "$PS1" ]
then
    export myproj=~/todays/fancy/project
fi

$ cd $myproj

3

คำตอบที่ชัดเจนคือตัวแปรสิ่งที่เป็นสัญลักษณ์เหล่านั้นในเชลล์ที่ใช้แทนสิ่งอื่นเช่นเดียวกับลิงก์สัญลักษณ์ในระบบไฟล์

path/to/project $ project=$PWD
path/to/project $ cd $elsewhere   # Previously created
path/to/elsewhere $ cd $project
path/to/project $ logout          # Variables gone, as required

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

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