pintasan direktori bash


29

Saat saya mengetik cd ~foo, saya ingin bash membawa saya ke beberapa direktori foosebagai jalan pintas untuk mengetik lintasan direktori lengkap foo. dan saya ingin dapat cp ~foo/bar.txt ~/bar.txtmenyalin file dari /foo/direktori ke direktori home ... Jadi pada dasarnya, saya ingin sesuatu yang berfungsi persis seperti ~/tidak, tetapi di mana saya menentukan apa direktori seharusnya. [Aku yakin aku harus jfgi, tapi aku tidak tahu harus berbuat apa]


zsh memiliki dukungan bawaan untuk ini. Ini disebut " direktori bernama "
Sildoreth

Saya mencari alat bookmark-shell terlalu lama, dan akhirnya saya berakhir dengan solusi saya sendiri (berbasis pencarian fuzzy) yang saya sukai lebih dari apa pun yang pernah saya lihat sebelumnya. Periksa jawaban ini: unix.stackexchange.com/a/209892/46011
Dmitry Frank

Jawaban:


40

Cara yang biasa saya lakukan adalah membuat direktori yang berisi symlink ke direktori yang Anda inginkan, dan menambahkan direktori itu ke CDPATH Anda. CDPATH mengontrol di mana cdakan mencari ketika Anda berpindah direktori, jadi jika direktori symlink ada di CDPATH Anda, Anda bisa cdke direktori yang disinkronkan secara instan:

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

Kelemahannya tentu saja tidak akan bekerja jika ada direktori di direktori Anda saat ini bernama "b" - yang diutamakan dari CDPATH


Saya biasanya tidak menyukai jawaban yang mengatakan "pertama Anda harus mengganti shell", tetapi fitur yang tepat ini ada di ZSH , jika Anda bersedia menggunakannya; itu disebut direktori bernama . Anda mengekspor variabel foo, dan ketika Anda merujuknya, ~foonilai ditentukan oleh $foo. Ini sangat nyaman karena berfungsi dalam perintah selain cd:

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

2
Dalam hal apa fitur ZSH ini berbeda dari melakukan: echo hi> / tmp / test; export t = / tmp; cat $ t / test Setidaknya pada komputer saya, ini berfungsi dengan baik. Satu-satunya perbedaan adalah karakter yang harus Anda ketik.
Steven D

merujuk op ke zsh adalah hal yang benar untuk dilakukan. Saya tidak pernah melewatkan fitur itu sekali dalam 15 tahun. sepertinya jenis hal yang membuat sebagian orang terobsesi sementara yang lain tidak peduli. itu sebabnya ada lebih dari satu cangkang.

2
@ Sebelas Ini sangat mirip, tetapi ZSH tahu itu adalah direktori bernama dalam hal ini sehingga dapat memperlakukannya secara khusus dalam ekspansi cepat dan perintah built-in shell
Michael Mrozek

[Saya sebagian besar akan melakukan ini menggunakan emacs Mx shell (karena saat itulah saya menggunakan terminal), saya kira itu mengesampingkan solusi ZSH] ...
Seamus

1
Menambahkannya ke .zshrc saya dan itu berhasil.
Seamus

10

Anda dapat menulis fungsi pembungkus untuk cddan menyebutnya "cd" (akhirnya fungsi akan memanggil builtin cd- menggunakan builtinkata kunci). Anda bisa menggunakan karakter awalan yang tidak akan diperluas Bash pada baris perintah sebelum fungsi Anda melihatnya dan itu tidak akan muncul sebagai karakter awal dalam nama direktori Anda, mungkin ":". Anda ingin membuatnya lebih kuat, tetapi inilah garis besar sederhana:

# 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
Ini ide yang sangat bagus
Michael Mrozek

Terima kasih atas saran ini - membuat solusi yang sangat sederhana di atasnya: aaverin.github.io/unix/macox/2014/05/26/bash-named-folders
AAverin

7

dengan bash:

~foodicadangkan untuk direktori home dari pengguna foo. Saya tidak akan merekomendasikan membuat pengguna hanya untuk kenyamanan itu.

Anda dapat membuat hidup Anda lebih mudah (atau lebih sulit) ketika mengubah direktori dengan mengatur CDPATHvariabel lingkungan (cari di bash(1)).

Terlepas dari itu, satu-satunya cara untuk berpikir adalah dengan menetapkan variabel lingkungan untuk direktori yang ingin Anda menyingkat.

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

2

Variabel Bash dapat digunakan untuk membuat sistem bookmark. Variabel akan bekerja dengan perintah apa pun dan bash akan tab melengkapi nama variabel. Dalam versi bash yang lebih baru, jika a / ditambahkan ke nama variabel, path yang berisi variabel dapat juga dilengkapi tab.

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).

Untuk kegigihan, deklarasi variabel dapat disimpan dalam file yang bersumber dari .bashrc. Karena file ini adalah skrip bash, ini bisa berisi deklarasi yang merujuk variabel lain, seperti aur="${HOME}/AUR", atau yang hanya berjalan di host tertentu if [[ $HOSTNAME == foo ]]; then bar=baz; fi, yang berguna jika Anda menggunakan kembali file konfigurasi di beberapa host dan pengguna.

Fungsi bash berikut (untuk ditambahkan ke .bashrc, atau bersumber dari itu) memungkinkan bookmark untuk ditambahkan dan dihapus dari file bookmark. Ini cukup baru dan tidak dijamin bebas dari bug.

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

Suatu cara akan membuat alias untuk cd yang menggantikan ~cke jalur yang diinginkan. Atau cukup gunakan zsh;)


2
Ya, saya berpikir untuk melakukan itu, seperti alias ~ c = "cd / daten / cvs / plugin_root" tetapi itu hanya membantu dengan cd, sementara direktori bernama dapat digunakan dengan setiap perintah.
fschmitt

0

Untuk mengubah direktori, Anda dapat menggunakan wcd: Di mana pun Direktori Ubah

Dengan itu, akan seperti itu wcd plugin_root.


Saya menginginkan sesuatu yang berfungsi dengan perintah selain cdjuga ...
Seamus

0

Saya memiliki fungsi di bawah ini yang akan membuat alias dengan cepat,

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
}

Ketika saya ingin mem-bookmark direktori, saya cukup mengetik s dirName. Ini menciptakan alias seperti alias dirName="cd /my/current/directory/;pwd". jadi saya bisa kembali ke direktori ini hanya dengan mengetik dirName. Saya memiliki versi yang menyimpannya ke bash_aliases juga. Ini bekerja di shell apa pun.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.