มีประวัติไดเรกทอรีสำหรับทุบตีหรือไม่?


26

reverse-search-history (Ctrl-r) ของ bash แต่มีเฉพาะไดเรคทอรีเท่านั้น?

ฉันมีลำดับชั้นของโฟลเดอร์แบบลึกที่ฉันต้องการข้ามไปดังนั้นฉันจึงต้องการใช้บางอย่างเช่น reverse-search-history แต่จะค้นหาเฉพาะชื่อโฟลเดอร์และให้เส้นทางที่สมบูรณ์แก่ฉัน

โดยพื้นฐานแล้วมันจะให้ผลลัพธ์ที่คล้ายกันกับการใช้!?แต่เพียงการจับคู่คำสั่งกับ cd ที่อยู่ข้างหน้าคุณสามารถผ่านผลลัพธ์และเส้นทางแบบเต็ม

เพื่อให้ห่างไกลทางออกที่ดีที่สุดที่ฉันได้พบเป็นbashmarks


1
ฉันเพิ่งเริ่มใช้ zและดูเหมือนว่าจะทำงานได้ไกล แต่ฉันใช้มันสำหรับบางเส้นทาง
Rob

คำตอบ:


11

ดูautojump :

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

autojump เป็นวิธีที่เร็วกว่าในการนำทางระบบไฟล์ของคุณ มันทำงานได้โดยการบำรุงรักษาฐานข้อมูลของไดเรกทอรีที่คุณใช้มากที่สุดจากบรรทัดคำสั่ง คำสั่ง jumpstat แสดงเนื้อหาปัจจุบันของฐานข้อมูล คุณต้องทำงานนิดหน่อยก่อนที่ฐานข้อมูลจะสามารถใช้งานได้ เมื่อฐานข้อมูลของคุณเสร็จสมบูรณ์อย่างสมเหตุสมผลคุณสามารถ "ข้าม" ไปยังไดเรกทอรี "cd" ed โดยทั่วไปโดยพิมพ์:
j dirspec


มันอาจจะนำไปสู่ปัญหาที่มีชื่อของสถานี
Daniel Beck

6

นั่นคือ

cd -

นั่นคือคำสั่ง "cd [space] [ยัติภังค์]" ซึ่งจะไปยังไดเรกทอรีที่คุณอยู่ก่อนโดยพื้นฐานแล้วคือ "history of depth 1" ซ้ำ "cd -" สลับไปมาระหว่างสองไดเรกทอรี

อ้างถึงหน้าคน:

ตัวถูกดำเนินการต่อไปนี้จะได้รับการสนับสนุน: [... ]

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

      cd "$OLDPWD" && pwd

น่าเสียดายที่ฉันไม่รู้ประวัติไดเรกทอรีในตัวจริง


มีpushd dir popdคู่ที่สามารถเก็บประวัติสแต็คของไดเรกทอรี สิ่งนี้มีประโยชน์มากในสคริปต์ที่ทำงานในโฟลเดอร์ต่างๆ
Jakuje

ฉันรู้pushdและpopdและมันก็พูดถึงที่นี่แล้ว
apurkrt

3

bash มี pushd / popd / dirs ฉันมีสิ่งนี้ใน. bashrc ของฉันเพื่อผลักดันไดเรกทอรีอัตโนมัติไปยังสแต็คของ bash

#let cd also pushd directories into stack. Use popd to reverse stack
function cd ()
{
  if [ -e $1 ]; then 
    pushd $1 &> /dev/null   #dont display current stack 
  fi
}

แสดงป๊อปอัพเหล่านี้โดยใช้popdและแสดงสแต็กโดยใช้dirs


2

ฉันมีประสบการณ์ที่ดีกับz-jumpมันช่วยให้เสร็จสมบูรณ์แม้ว่าจะเป็นปลายทางสุดท้ายเท่านั้น แต่ไม่ได้ก้าวผ่านเส้นทาง มันจะแสดงเส้นทางแบบเต็มเมื่อแท็บเสร็จสมบูรณ์


1

เพียงเขียนด้วยประสบการณ์ของตัวเองฉันเขียนสคริปต์ง่าย ๆ เพื่อจัดการกับความต้องการนี้เมื่อไม่นานมานี้มันเขียนทับคำสั่ง builtin cd ด้วยฟังก์ชั่นเรียบง่ายซึ่งผนวกตำแหน่งไดเรกทอรีใหม่ไปยังไฟล์ประวัติจากนั้นสคริปต์หลามจะใช้ จัดเตรียมอินเตอร์เฟส bash ที่อัพเดตรายการไดเร็กทอรีที่เรียงลำดับแบบไดนามิกขณะที่คุณป้อนคำค้นหาซึ่งคล้ายกับการค้นหาคำสั่ง reverse ของ bash

มันมีอยู่ในgit-hubสำหรับผู้ที่อยากรู้อยากเห็น


ร็อคบน gearoid
Darth Egregious

1

ฉันต้องการแนะนำให้ฉันltcdนำทางอย่างรวดเร็วผ่านประวัติไดเรกทอรี:

https://github.com/dczhu/ltcd

ซีดีสาธิต gif

มันมีคุณสมบัติดังต่อไปนี้เพื่อทำให้ชีวิตง่ายขึ้น:

  • รายการ Global dir ซึ่งแสดง dirs ที่เยี่ยมชมล่าสุดจากแท็บเทอร์มินัล / หน้าต่างทั้งหมด
  • รายชื่อ dir ท้องถิ่นซึ่งเป็นท้องถิ่นเซสชั่นเปลือกปัจจุบัน
  • รายการทั้งสองรองรับการนำทางอย่างรวดเร็วโดยใช้ j / k (เลื่อนขึ้น / ลง), ตัวเลขและค้นหาคำ
  • การกระโดดข้ามโลกฟรี (เช่น "cd dir" หรือ "cd ar" เพื่อไปที่ / path / to / foo / bar / directory /)

1

ฉันได้สร้างสคริปต์ที่มีฟังก์ชั่นที่คล้ายกับคำสั่งของ oh-my-zshdirs -vที่ใช้กับ bash ได้ หากคุณเคยใช้oh-my-zshคุณอาจสังเกตเห็นว่าประวัติไดเรกทอรีที่ระบุโดยคำสั่งdirs -vจะถูกรีเซ็ตทุกครั้งที่คุณออกจากเทอร์มินัล อย่างไรก็ตามจะไม่เกิดขึ้นหากคุณใช้สคริปต์นี้

ฟังก์ชั่น:

  • แสดง 10 dรายการล่าสุดไดเรกทอรีที่ใช้กับ

  • ข้ามไปยังไดเรกทอรีใด ๆ ในรายการโดยพิมพ์หมายเลขของไดเรกทอรีในรายการ คุณต้องใช้ 0 แทน 10 เพื่อข้ามไปยังไดเรกทอรีที่ 10

  • เส้นทางไดเรกทอรีจะถูกวางไว้ด้านบนของรายการทุกครั้งที่คุณใช้v( vim ) เพื่อแก้ไขไฟล์หรือo( xdg-open ) เพื่อเปิดไฟล์จากไดเรกทอรีนั้น หรือถ้าคุณชอบทุกครั้งที่คุณไปที่ไดเรกทอรี

คุณสามารถดูได้ในการดำเนินการที่นี่


0

คุณสามารถเพิ่มข้อมูลโค้ดนี้ในของคุณ~/.bashrcได้

  1. จัดเตรียมคำสั่ง cd ที่กำหนดเอง

        function cd ()
        {
            exists=false
            for dir in "${CDHIST[@]}"; do
                [ "$dir" == "$1" ] && {
                    exists == true
                    break
                }
            done
    
            $exists || {
                len=${#CDHIST[@]}
                ${CDHIST[$len]} = "$1"
            }
    
            builtin cd "$1"
        }
  2. และจัดเตรียมคำสั่งการค้นหาประวัติซีดี

    function cdhist ()
    {
        #TODO: Make this magical.
    
        for dir in "${CDHIST[@]}"; do
            echo "$dir"
        done
    }

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

คุณยังสามารถเพิ่มบาง "ตั้งโปรแกรมเสร็จสิ้น" ฟังก์ชั่นซึ่งสามารถนำมาใช้เพื่อเพิ่มเต็มรูปแบบcd /path/to/mydirคำสั่งตั้งอยู่บนพื้นฐานที่ไม่ซ้ำกันสตริงย่อยของแม้ว่าวิธีการที่จะยังคงต้องการให้คุณชนิด/path/to/unique/mydircd unique/mydir<tab>


1
ฉันอ่านโค้ดของคุณผิดและพบdirsคำสั่งของ bash ซึ่งทำสิ่งเดียวกับmy_dirsแต่ในหนึ่งบรรทัด
idbrii

1
เย็น. ดังนั้นทุบตีไม่เพียงสนับสนุน มันใช้มัน ฉันหวังว่าฉันจะมีเวลามากขึ้นในการศึกษาเวทมนตร์ลึกของ bash แน่นอนว่านี่รองรับการ pushd เท่านั้นไม่ใช่ cd แต่ฉันคิดว่าalias cd=pushdจะเป็นรูปแบบที่หรูหราที่สุด
jpaugh

0

คุณสามารถสร้างของคุณเองcdคำสั่งด้วยpushd, popd, dirs คำสั่ง builtin

การใช้

  • cd -- (แสดงรายการประวัติปัจจุบัน)

  • cd -num (ไปที่ไดเรกทอรี NUM)

  • cd - (ไปที่ไดเรกทอรีก่อนหน้า)


function cd()
{
    local hnum=16  # number of entries
    local new_dir index dir cnt
    if ! [ $# -eq 0 ]; then
        if [[ $# -eq 2 && $1 = "--" ]]; then
            shift
        else 
            if ! { [ $# -eq 1 ] && [[ $1 =~ ^(-[0-9]{,2}|-|--|[^-].*)$ ]] ;}
            then
                builtin cd "$@"
                return
            fi
        fi
    fi
    [ "$1" = "--" ] && { dirs -v;  return ;}
    new_dir=${1:-$HOME}
    if [[ "$new_dir" =~ ^(-[0-9]{,2}|-)$ ]]; then
        index=${new_dir:1}
        [ -z "$index" ] && index=1
        new_dir=$(dirs -l +$index) || return
    fi
    pushd -- "$new_dir" > /dev/null || return
    popd -n +$hnum &> /dev/null
    new_dir=$PWD cnt=1
    while dir=$(dirs -l +$cnt 2> /dev/null); do
        if [ "$dir" = "$new_dir" ]; then
            popd -n +$cnt > /dev/null
            continue
        fi
        let cnt++
    done
}

export -f cd

-1

ฉันรวมเครื่องมือนี้เข้าด้วยกันซึ่งรวมโซลูชันก่อนหน้าสำหรับการจัดเก็บประวัติ CLI ทั่วโลกที่ครอบคลุมกับเครื่องมือ grepping แบบโต้ตอบที่เรียกว่า percol (แมปกับ C ^ R) ฉันใช้มันเพื่อเรียกคำสั่งโดยที่พวกเขาถูกเรียกใช้หรือเพื่อค้นหาไดเรกทอรีโดยคำสั่ง มันยังคงลื่นไหลในเครื่องแรกที่ฉันเริ่มใช้ตอนนี้ด้วยประวัติ CLI> 2 ปี

เครื่องมือ grep ทำงานได้ทั้งบนพา ธ และคำสั่ง แต่อาจยังมีประโยชน์สำหรับคุณ ดูเพิ่มเติม 'dirs -v' ใน zsh

https://github.com/gawells/ariadne


สิ่งนี้จะเก็บประวัติ CLI ด้วยพา ธ คำสั่งและวันที่ มันไม่ได้เป็นเส้นทางเท่านั้น แต่ยังมีประโยชน์สำหรับประวัติค้นหา dir ย้อนกลับ (ทุบตีและ zsh)
กอร์ดอนเวลส์

ฉันคิดว่าคุณลืมลิงก์ไปยังเครื่องมือของคุณ จากคำอธิบายของคุณฉันสงสัยว่าคำสั่งนั้นจะไม่สามารถทำงานได้จากที่ที่ถูกเรียกเท่านั้น ดังนั้นcd share/manจะใช้งานได้ถ้าฉันอยู่ใน / usr แล้ว
idbrii

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