bash dizin kısayolları


28

Ben yazarken cd ~foo, bazı dizine beni almaya bash istiyorum footam dizin yolunu yazmak için kısayol olarak foo. ve cp ~foo/bar.txt ~/bar.txtbir dosyayı /foo/dizinden ana dizine kopyalayabilmeyi isterdim ... Temel olarak, tam olarak çalışan bir şey istiyorum ~/, ancak dizinin ne olacağını belirtiyorum. [Jfgi yapmam gerektiğinden eminim, ama ne yapacağımı bilmiyorum]


zsh bunun için yerleşik bir desteğe sahiptir. Adı " dizinleri adlandırılmış "
Sildoreth

Çok uzun bir süredir bazı yer işaretleme araçları aramıştım ve sonunda daha önce gördüğüm herhangi bir şeyden daha çok hoşlandığım kendi (belirsiz arama tabanlı) çözümümle sona erdi. Bu cevabı kontrol et: unix.stackexchange.com/a/209892/46011
Dmitry Frank

Yanıtlar:


39

Bunu yapmamın yolu, kısayolların yapmasını istediğiniz dizinlere sembolik bağlantılar içeren bir dizin oluşturmak ve bu dizini CDPATH'inize eklemek. CDPATH cd, dizinleri değiştirdiğinizde nerede arama yapılacağını kontrol eder; bu nedenle, bu bağlantı dizini dizini CDPATH'inizde ise cd, bağlantı verilen dizinlerden herhangi birine anında erişebilirsiniz :

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

Tabii ki dezavantajı, geçerli dizinde "b" adında bir dizin varsa işe yaramaz - CDPATH'den öncelikli olan


Normalde de "ilk geçiş kabukları gerekiyor" cevapları sevmediğim ama bu kesin bir özellik var ZSH , eğer sizsiniz, bunun yerine kullanmak isteyen; buna adlandırılmış dizinler denir . Bir değişkeni dışa aktarırsınız foove ~foobuna başvururken değeri çözülür $foo. Bu özellikle kullanışlıdır çünkü aşağıdaki komutlarda da çalışır cd:

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

2
Bu ZSH özelliği aşağıdakilerden farklıdır: echo hi> / tmp / test; export t = / tmp; cat $ t / test En azından makinemde bu gayet iyi çalışıyor. Tek fark, yazmanız gereken karakterdir.
Steven D

op’u zsh’ye gönderme yapmak doğru olanıdır. bu özelliği 15 yılda bir kaçırmadım. Bazılarının umursamadığı zamanlarda bazılarının gerçekten takıntılı hale geldiği türden bir şey gibi görünüyor. bu yüzden birden fazla kabuk var.

2
@Steven Oldukça benzer, ancak ZSH, bu durumda adlandırılmış bir dizin olduğunu biliyor, bu yüzden özel istemi genişletmelerinde ve kabuk yerleşik komutlarında özel olarak ele alabilir
Michael Mrozek

[Bunu çoğunlukla emacs Mx kabuğu kullanarak yapıyordum (terminali kullandığımdan beri), sanırım ZSH çözümlerini hariç tutuyor] ...
Seamus

1
Benim .zshrc ekledi ve bu çalıştı.
Seamus

10

Bir sarmalayıcı işlevi cdyazıp "cd" olarak adlandırabilirsiniz (sonuçta işlev çağırır builtin cd- builtinanahtar sözcüğü kullanarak ). İşlevinizin görmeden önce Bash'in komut satırında genişlemeyeceği ve belki de ":" dizin adlarında ilk karakter olarak görünmesi muhtemel olmayan bir önek karakteri kullanabilirsiniz. Daha sağlam hale getirmek istersiniz, ama işte basit bir taslak:

# 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
Bu gerçekten çok iyi bir fikir
Michael Mrozek

Bu öneri için teşekkürler - üstüne gerçekten basit bir çözüm getirdim
AAverin

7

bash ile:

~foofoo kullanıcısının ana dizini için ayrılmıştır. Bu kolaylık için kullanıcıları yaratmanızı tavsiye etmem.

Ortam değişkenini ayarlayarak dizinleri değiştirirken hayatınızı kolaylaştırabilir (veya zorlaştırabilirsiniz ).CDPATHbash(1)

Bunun dışında, düşünmenin tek yolu kısaltmak istediğiniz dizinler için ortam değişkenleri belirlemektir.

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

2

Bash değişkenleri bir yer imi sistemi oluşturmak için kullanılabilir. Değişkenler herhangi bir komutla çalışacak ve bash değişken ismini tamamlayan sekme olacaktır. Bash'ın yeni sürümlerinde, eğer değişken ismine bir / eklenirse, değişkenin içerdiği yol da sekme ile tamamlanabilir.

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

Kalıcılık için değişken bildirimleri .bashrc kaynaklı bir dosyada tutulabilir. Bu dosya bir bash betiği olduğu için aur="${HOME}/AUR", if [[ $HOSTNAME == foo ]]; then bar=baz; ficonfig dosyalarını birden fazla ana bilgisayar ve kullanıcı için yeniden kullanırsanız kullanışlıdır gibi diğer değişkenlere referans veren veya yalnızca belirli ana bilgisayarlarda çalışan bildirimler içerebilir .

Aşağıdaki bash işlevi (.bashrc dosyasına eklenecek veya bu dosyadan kaynaklanacak), yer imlerinin yer imleri dosyasına eklenmesini ve kaldırılmasını sağlar. Oldukça yeni ve hatalardan arındırılmış olduğu garanti edilmez.

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

Bir yol, cd ~ciçin istenen yolun yerine bir diğer ad oluşturmaktır . Veya sadece zsh kullanın;)


2
Evet, bunu alias ~ c = "cd / daten / cvs / plugin_root" gibi yapmayı düşündüm ama bu sadece cd ile yardımcı olur, ancak adlandırılmış dizinler her komutta kullanılabilir.
fschmitt


0

Anında takma ad yaratacak aşağıdaki fonksiyona sahibim,

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
}

Bir dizini yer imlerine eklemek istediğimde, sadece yazıyorum s dirName. Bu gibi bir takma ad oluşturur alias dirName="cd /my/current/directory/;pwd". bu yüzden sadece yazarak bu dizine geri gelebilirim dirName. Ben de bash_aliases içine kaydeder bir sürümü var. Bu herhangi bir kabukta çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.