Có một lịch sử thư mục cho bash?


26

Có cái gì đó giống như lịch sử tìm kiếm ngược của bash (Ctrl-r), nhưng chỉ dành cho các thư mục không?

Tôi có một số phân cấp thư mục sâu mà tôi muốn chuyển đến, vì vậy tôi muốn sử dụng một cái gì đó như lịch sử tìm kiếm ngược, nhưng nó chỉ tìm tên thư mục và cung cấp cho tôi đường dẫn tuyệt đối.

Về cơ bản, nó sẽ cho kết quả tương tự với việc sử dụng !?nhưng chỉ khớp các lệnh với cd ở phía trước, bạn có thể bước qua kết quả và đường dẫn đầy đủ.

Cho đến nay, giải pháp tốt nhất tôi tìm thấy là bashmark .


1
Gần đây tôi đã bắt đầu sử dụng z và điều đó dường như hoạt động cho đến nay, nhưng tôi đã sử dụng nó cho một vài con đường.
Cướp

Câu trả lời:


11

Có một cái nhìn về autojump :

Một trong những lệnh shell được sử dụng nhiều nhất là miền cd cd. Một cuộc khảo sát nhanh giữa những người bạn của tôi đã tiết lộ rằng từ 10 đến 20% tất cả các lệnh họ gõ thực sự là các lệnh cd! Thật không may, việc nhảy từ một phần của hệ thống của bạn sang phần khác bằng cd yêu cầu bạn phải nhập gần như toàn bộ đường dẫn, điều này không thực tế và đòi hỏi nhiều thao tác bàn phím.

autojump là một cách nhanh hơn để điều hướng hệ thống tập tin của bạn. Nó hoạt động bằng cách duy trì cơ sở dữ liệu của các thư mục bạn sử dụng nhiều nhất từ ​​dòng lệnh. Lệnh jumpstat cho bạn thấy nội dung hiện tại của cơ sở dữ liệu. Bạn cần phải làm việc một chút trước khi cơ sở dữ liệu có thể sử dụng được. Khi cơ sở dữ liệu của bạn đã hoàn tất một cách hợp lý, bạn có thể chuyển nhảy vào một thư mục ed "cd" thông thường bằng cách gõ:
j dirspec


Nó có thể dẫn đến các vấn đề với tiêu đề của Terminal .
Daniel Beck

6

cd -

đó là lệnh "cd [space] [hyphen]", đi đến thư mục bạn đã ở trước đó, về cơ bản là "lịch sử của độ sâu 1". Lặp lại "cd -" chuyển đổi qua lại giữa hai thư mục.

Trích dẫn trang người đàn ông:

Các toán hạng sau sẽ được hỗ trợ: [...]

Khi [dấu gạch nối] được sử dụng làm toán hạng, điều này sẽ tương đương với lệnh:

      cd "$OLDPWD" && pwd

Thật không may, tôi không biết về một lịch sử thư mục tích hợp thực sự.


pushd dir popdcặp có thể lưu trữ ngăn xếp lịch sử của bạn. Điều này thực sự hữu ích trong các tập lệnh hoạt động trong các thư mục khác nhau.
Jakuje

Tôi biết pushdpopd, và nó cũng được đề cập ở đây rồi.
apurkrt

3

bash có Pushd / popd / dirs. Tôi có cái này trong .bashrc để tự động đẩy các thư mục lên ngăn xếp của 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
}

Bật chúng bằng cách sử dụng popdvà hiển thị ngăn xếp bằngdirs


2

Tôi đã có kinh nghiệm tốt với z-jump Nó cho phép hoàn thành, mặc dù chỉ cho đích đến cuối cùng, không bước qua một con đường. Tuy nhiên, nó hiển thị đường dẫn đầy đủ khi hoàn thành tab.


1

Chỉ để thỏa mãn kinh nghiệm của bản thân, tôi đã viết một tập lệnh đơn giản để giải quyết yêu cầu này một thời gian trước, nó ghi đè lệnh cd dựng sẵn với một chức năng đơn giản nối thêm vị trí thư mục mới vào tệp lịch sử, tập lệnh python sau đó được sử dụng cung cấp giao diện bash tự động cập nhật danh sách các thư mục được sắp xếp khi bạn nhập cụm từ tìm kiếm, hơi giống như tìm kiếm lệnh ngược của bash.

Nó có sẵn trên git-hub cho những người tò mò.


đá trên gearoid
Darth Egregious

1

Tôi muốn giới thiệu tôi ltcdđể điều hướng nhanh qua lịch sử thư mục:

https://github.com/dczhu/ltcd

cd gif demo

Nó cung cấp các tính năng sau để làm cho cuộc sống dễ dàng hơn:

  • Danh sách thư mục toàn cầu, hiển thị các thư mục được truy cập gần đây từ tất cả các tab / cửa sổ đầu cuối.
  • Danh sách thư mục địa phương, đó là phiên bản cục bộ hiện tại.
  • Cả hai danh sách đều hỗ trợ điều hướng nhanh bằng cách sử dụng j / k (đi xuống / lên), số và tìm kiếm từ.
  • Nhảy miễn phí toàn cầu (ví dụ: "cd dir" hoặc "cd ar" để đi đến / path / to / foo / bar / thư mục /).

1

Tôi đã tạo một tập lệnh có chức năng tương tự lệnh của oh-my-zshdirs -v hoạt động trên bash. Nếu bạn đã từng sử dụng oh-my-zsh , bạn có thể nhận thấy rằng lịch sử thư mục được cung cấp bởi lệnh dirs -vsẽ được đặt lại mỗi khi bạn thoát khỏi thiết bị đầu cuối. Tuy nhiên, điều đó sẽ không xảy ra nếu bạn sử dụng tập lệnh này .

Các chức năng:

  • Hiển thị danh sách 10 thư mục được sử dụng gần đây nhất với d.

  • Chuyển đến bất kỳ thư mục nào trong danh sách bằng cách nhập số lượng thư mục trong danh sách. Bạn cần sử dụng 0 thay vì 10 để chuyển đến thư mục thứ 10.

  • Một đường dẫn thư mục sẽ được đặt lên đầu danh sách mỗi khi bạn sử dụng v( vim ) để chỉnh sửa tệp hoặc o( xdg-open ) để mở tệp từ thư mục đó. Hoặc nếu bạn thích, mỗi khi bạn truy cập một thư mục.

Bạn có thể thấy nó trong hành động ở đây .


0

Chà, bạn có thể thêm đoạn mã này vào ~/.bashrc,

  1. cung cấp một lệnh cd tùy chỉnh

        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. và cung cấp một lệnh tìm kiếm lịch sử cd.

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

Tất nhiên, lệnh cdhist tôi cung cấp là rất cơ bản, và không phải là những gì bạn muốn; nhưng có thể hiểu được sử dụng các câu lệnh tình huống hoặc mở rộng tham số để đạt được một cái gì đó tương tự như những gì bạn muốn.

Bạn thậm chí có thể thêm một số chức năng "Hoàn thành có thể lập trình", có thể được sử dụng để thêm cd /path/to/mydirlệnh đầy đủ dựa trên một chuỗi con duy nhất /path/to/unique/mydir, mặc dù phương thức đó vẫn sẽ yêu cầu bạn nhập cd unique/mydir<tab>.


1
Tôi đã đọc sai mã của bạn và tìm thấy dirslệnh của bash về cơ bản giống như my_dirs, nhưng trên một dòng.
idbrii

1
Mát mẻ. Vì vậy, không chỉ bash hỗ trợ nó; nó thực hiện nó Tôi ước mình có nhiều thời gian hơn để học phép thuật sâu sắc của bash. Tất nhiên, điều này chỉ hỗ trợ ghi nhớ Pushd, không phải cd. Nhưng tôi cho rằng alias cd=pushdsẽ là hình thức thanh lịch nhất.
jpaugh

0

Bạn có thể xây dựng riêng của bạn cdlệnh với pushd, popd,dirs lệnh dựng sẵn.

Sử dụng

  • cd -- (liệt kê lịch sử hiện tại)

  • cd -num (đi đến thư mục num)

  • cd - (đi đến thư mục trước)


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

Tôi kết hợp công cụ này với nhau, kết hợp các giải pháp trước đây để lưu trữ lịch sử CLI toàn cầu với một công cụ grepping tương tác được gọi là percol (ánh xạ tới C ^ R). Tôi sử dụng nó để lấy các lệnh theo nơi chúng được chạy hoặc để tìm một thư mục bằng một lệnh. Nó vẫn còn mượt trên chiếc máy đầu tiên tôi bắt đầu sử dụng, bây giờ với lịch sử CLI> 2 năm tuổi.

Công cụ grep hoạt động trên cả đường dẫn và lệnh, nhưng vẫn có thể hữu ích cho bạn. Xem thêm 'dirs -v' trong zsh

https://github.com/gawells/ariadne


điều này lưu trữ một lịch sử CLI với đường dẫn, lệnh và ngày. Nó không chỉ đường dẫn, nhưng vẫn hữu ích cho việc tìm kiếm ngược lịch sử thư mục (bash và zsh)
Gordon Wells

Tôi nghĩ rằng bạn quên liên kết đến công cụ của bạn. Từ mô tả của bạn, tôi nghi ngờ rằng nó thiếu trong các lệnh chỉ hoạt động từ nơi chúng được gọi. Vì vậy, cd share/manchỉ hoạt động nếu tôi đã ở / usr.
idbrii

Rất tiếc! xấu của tôi, tôi nghĩ rằng tôi đã đặt url trong văn bản, đã không nhận thấy có gì đó không ổn
Gordon Wells
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.