phím tắt thư mục bash


28

Khi tôi nhập cd ~foo, tôi muốn bash đưa tôi đến thư mục nào đó foolàm lối tắt để nhập đường dẫn thư mục đầy đủ foo. và tôi muốn có thể cp ~foo/bar.txt ~/bar.txtsao chép một tập tin từ /foo/thư mục vào thư mục chính ... Vì vậy, về cơ bản, tôi muốn một cái gì đó hoạt động chính xác như thế ~/, nhưng nơi tôi chỉ định thư mục nên là gì. [Tôi chắc chắn tôi nên jfgi, nhưng tôi không biết phải làm gì]


zsh đã tích hợp hỗ trợ cho việc này. Nó được gọi là " thư mục được đặt tên "
Sildoreth

Tôi đã tìm kiếm một số công cụ đánh dấu shell quá lâu và cuối cùng tôi đã kết thúc với giải pháp (dựa trên tìm kiếm mờ) của riêng mình mà tôi thích nhiều hơn bất cứ thứ gì tôi từng thấy trước đây. Kiểm tra câu trả lời này: unix.stackexchange.com/a/209892/46011
Dmitry Frank

Câu trả lời:


39

Cách tôi đã sử dụng để làm điều này là tạo một thư mục chứa các liên kết tượng trưng đến các thư mục mà bạn muốn các phím tắt thực hiện và thêm thư mục đó vào CDPATH của bạn. CDPATH kiểm soát nơi cdsẽ tìm kiếm khi bạn chuyển đổi thư mục, vì vậy nếu thư mục của các liên kết tượng trưng nằm trong CDPATH của bạn, bạn có thể cdđến bất kỳ thư mục liên kết tượng trưng nào ngay lập tức:

mkdir ~/symlinks
ln -s /usr/bin ~/symlinks/b
export CDPATH=~/symlinks
cd b   # Switches to /usr/bin

Nhược điểm của khóa học là nó sẽ không hoạt động nếu có một thư mục trong thư mục hiện tại của bạn có tên là "b" - được ưu tiên hơn CDPATH


Tôi thường không thích các câu trả lời rằng "trước tiên bạn cần chuyển đổi vỏ", nhưng tính năng chính xác này tồn tại trong ZSH , nếu bạn sẵn sàng sử dụng thay thế; nó được gọi là thư mục được đặt tên . Bạn xuất một biến foovà khi bạn tham chiếu đến ~foonó sẽ giải quyết giá trị của $foo. Điều này đặc biệt thuận tiện vì nó hoạt động trong các lệnh bên cạnh cd:

echo hi > /tmp/test
export t=/tmp
cat ~t/test   # Outputs "hi"

2
Tính năng ZSH này khác với cách làm như thế nào: echo hi> / tmp / test; export t = / tmp; cat $ t / test Ít nhất là trên máy của tôi, nó hoạt động tốt. Sự khác biệt duy nhất là nhân vật bạn phải gõ.
Steven D

giới thiệu op đến zsh là điều nên làm. Tôi đã không bỏ lỡ tính năng đó một lần trong 15 năm. có vẻ như là điều mà một số người thực sự bị ám ảnh trong khi những người khác không quan tâm. đó là lý do tại sao có nhiều hơn một vỏ.

2
@Steven Nó khá giống nhau, nhưng ZSH biết đó là một thư mục có tên trong trường hợp này nên nó có thể xử lý nó đặc biệt trong các bản mở rộng nhanh chóng và các lệnh tích hợp shell
Michael Mrozek

[Tôi chủ yếu thực hiện việc này bằng cách sử dụng shell Mx của emacs (vì đó là khi tôi sử dụng thiết bị đầu cuối), tôi đoán rằng sẽ loại trừ các giải pháp ZSH] ...
Seamus

1
Đã thêm nó vào .zshrc của tôi và nó đã hoạt động.
Seamus

10

Bạn có thể viết một hàm bao bọc cdvà gọi nó là "cd" (cuối cùng là hàm sẽ gọi builtin cd- sử dụng builtintừ khóa). Bạn có thể sử dụng một ký tự tiền tố mà Bash sẽ không mở rộng trên dòng lệnh trước khi hàm của bạn nhìn thấy nó và điều đó dường như không xuất hiện dưới dạng ký tự ban đầu trong tên thư mục của bạn, có lẽ là ":". Bạn sẽ muốn làm cho nó mạnh mẽ hơn, nhưng đây là một phác thảo đơn giản:

# format: [semicolon] shortcut colon destination [semicolon] ...
export CDDATA='foo:/path/to/foo;bar:/path/to/bar;baz:/path/to/baz'

cd () {
    local dest=$1
    if [[ $dest == :* ]]
    then
        [[ $CDDATA =~ (^|;)${dest:1}:([^;]*)(;|$) ]]
        dest=${BASH_REMATCH[2]}
    fi
    if [[ -z $dest ]]
    then
        cd
    else
        builtin cd "$dest"
    fi
}

cd :bar    # pwd is now /path/to/bar

1
Đây là một ý tưởng thực sự tốt
Michael Mrozek

Cảm ơn đề xuất này - đã thực hiện giải pháp thực sự đơn giản của tôi trên đầu trang: aaverin.github.io/unix/macox/2014/05/26/bash-named- Folders
AAverin

7

với bash:

~foođược dành riêng cho thư mục nhà của người dùng foo. Tôi không khuyên bạn nên tạo người dùng chỉ để thuận tiện.

Bạn có thể làm cho cuộc sống của bạn dễ dàng hơn (hoặc khó hơn) khi thay đổi thư mục bằng cách đặt CDPATHbiến môi trường (tra cứu nó bash(1)).

Ngoài ra, cách duy nhất để nghĩ đến là đặt các biến môi trường cho các thư mục bạn muốn viết tắt.

$ FOODIR=/var/lib/misc
$ cp ~/bar.txt $FOODIR

2

Biến Bash có thể được sử dụng để tạo một hệ thống đánh dấu. Các biến sẽ hoạt động với bất kỳ lệnh nào và bash sẽ hoàn thành tên biến. Trong các phiên bản mới hơn của bash, nếu a / được gắn vào tên biến, đường dẫn của biến chứa cũng có thể được hoàn thành.

mydir=/home/chris/dir
ls $my         # Tab completion works on variable name.
ls $mydir/     # Tab completion is equivalent to that with ls /home/chris/dir/
               # (doesn't work in older versions of bash).

Để duy trì, các khai báo biến có thể được giữ trong một tệp có nguồn gốc từ .bashrc. Vì tệp này là tập lệnh bash, nên nó có thể chứa các khai báo tham chiếu các biến khác, chẳng hạn như aur="${HOME}/AUR", hoặc chỉ chạy trên một số máy chủ nhất định if [[ $HOSTNAME == foo ]]; then bar=baz; fi, rất hữu ích nếu bạn sử dụng lại tệp cấu hình trên nhiều máy chủ và người dùng.

Hàm bash sau (sẽ được thêm vào .bashrc hoặc có nguồn gốc từ nó) cho phép thêm dấu trang vào và xóa khỏi tệp dấu trang. Nó là khá mới và không được bảo đảm là không có lỗi.

bookmark_file=~/.bookmarks
source "$bookmark_file"

bm() {
usage='Usage:
bm add <name> <path>           Create a bookmark for path.
bm add <name>                  Create a bookmark for the current directory.
bm update                      Source the bookmark file.
bm remove <name>               Remove a bookmark'              

case $1 in
    add)
        local path
        if [[ $# -eq 2 ]]; then
            path=.
        elif [[ $# -eq 3 ]]; then
            if [[ -e $3 ]]; then
                path="$3"
            else
                echo "bm: ${3}: No such file or directory."
                return 1
            fi               
        else
            echo "$usage"
            return 1
        fi

        if declare | grep "^${2}=" > /dev/null; then
            echo "bm: The name $2 is in use."
            return 1
        fi
        path=$(readlink -f "$path")
        echo ${2}=\""$path"\" >> "$bookmark_file"
        eval ${2}=\""$path"\"
        return 0
        ;;
    update)
        if [[ $# -eq 1 ]]; then
            source "$bookmark_file"
            return 0
        fi
        ;;
    remove)
        if [[ $# -eq 2 ]]; then
            unset $2
            local contents=$(grep -v "^${2}=" "$bookmark_file")
            echo "$contents" > "${bookmark_file}.tmp"
            rm -f "$bookmark_file"
            mv "${bookmark_file}.tmp" "$bookmark_file"
            return 0
        fi
        ;;
esac

echo "$usage"
return 1
}

0

Một cách sẽ là tạo một bí danh cho cd thay thế ~ccho đường dẫn mong muốn. Hoặc chỉ sử dụng zsh;)


2
Vâng, tôi đã nghĩ về việc làm điều đó, như bí danh ~ c = "cd / daten / cvs / plugin_root" nhưng điều đó chỉ giúp với cd, trong khi các thư mục có tên có thể được sử dụng với mọi lệnh.
fschmitt


0

Tôi có chức năng dưới đây sẽ tạo bí danh khi đang bay,

s () {
    if [[ "x$1" != "x" ]]
    then
        alias $1="cd $PWD;pwd"
        echo "alias $1=\"cd $PWD;pwd\""
    else
        echo "Usage: s[s] <directory bookmark name>"
        return 1
    fi
}

Khi tôi muốn đánh dấu một thư mục, tôi chỉ cần gõ s dirName. Điều này tạo ra một bí danh như thế nào alias dirName="cd /my/current/directory/;pwd". vì vậy tôi có thể quay lại thư mục này bằng cách gõ dirName. Tôi có một phiên bản lưu nó vào bash_aliases. Điều này hoạt động trong bất kỳ vỏ.

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.