シンボリックリンクのエイリアスと同等ですか?


18

ホームフォルダー内のいくつかのディレクトリを頻繁にジャンプして、それらの作成にうんざりする必要があることに気づきました。従来はシンボリックリンクであった、より迅速なアプローチが必要です。

ただし、ホームディレクトリを多数のシンボリックリンクで煩雑にしたくありません。~/links/ディレクトリを作成、シンボリックリンクで混乱させることもできますが、それでもいです。また、毎日変更するシンボリックリンク(.bashrcで定義)を作成して、現在のディレクトリにジャンプすることもできます。

シンボリックリンクを効果的にエイリアスし、クイックナビゲーションのリンクとして認識されるもののls、ホームディレクトリを実行しても実際には表示されず、現在のセッションを超えて持続しないものを作成する方法はありますか?


4
プッシュとポップを検討することがあります
ルイFリベイロ

Jeroen Janssenのアプローチは、この正確なニーズに適応可能で低コストであることがわかりました。jeroenjanssens.com
Theophrastus

2
どのシェルを使用していますか?
ジル「SO-悪であるのをやめる」

@Theophrastus Heh —それは基本的に私が再実装したもので、私の答えではそれほどエレガントではありません。
mattdm

3
正確にあなたが探しているものではありませんが、2つの監督の間を行き来するときにまだ便利かもしれません:最後のディレクトリへのcd -意志cdは以前でした。したがって、2回実行すると、開始した場所に戻ります...「以前の場所でsomeFile.txtを編集するのを忘れていた」という状況に非常に良い=>単純に:cd -someFile.txtを編集しますcd -
dingalapadum

回答:


12

タブ補完を使用できます。多くのLinuxディストリビューションでは、デフォルトでbashが設定されているため、[TAB]キーを押すと、一致する可能性のあるリストが表示されます。一致するものが1つだけの場合はすべて入力されます。cdの場合、これは通常、現在の作業ディレクトリのサブディレクトリのリストです。それを上書きすることもできますが、代わりjdに「ジャンプディレクトリ」のようなエイリアスを作成することをお勧めします。

alias jd=cd

そして、jdの補完として必要な「ブックマーク」を定義します。より多くのオプション(コマンドまたは関数から結果をその場で自動生成することを含む)については、bashのマニュアルページをご覧ください。しかし、最も簡単な方法は、次のような単語のリストです-W

complete -W "/ srv / www〜/ tmp〜/ work" jd

ここで、jd[TAB]を入力してヒットすると、「ブックマーク」が表示されます。あいまいな部分を入力し、[TAB]を押して完了します。(上記では、~sは私のホームディレクトリに展開されるため、最初の[TAB]はを提供し/wもう一度[TAB]を押す/srv/wwwと入力されます。)

もちろん、これを~/.bash_profile永続化するために入れます。

または、これを次のレベルに進めることができます。ディレクトリを作成します~/.shortcuts-ドットで始まり、非表示になり、きれいなホームディレクトリをめちゃくちゃにしないでください-そして、目的のディレクトリへのシンボリックリンクでそれを埋めます。次に、これを〜/ .bash_profile に入れます:

_list_shortcuts() 
{ 
    COMPREPLY=($( compgen -W "$( ls ~/.shortcuts )" -- ${COMP_WORDS[COMP_CWORD]} ))
}
jd()
{
    cd -P ~/.shortcuts/$1
}
complete -F _list_shortcuts jd

これは、_list_shortcuts名前のリストを作成するjdための機能のやや複雑な補完を定義し、単なるエイリアスではなく関数になりcdます。-Pフラグcdすべてが透明魔法になるように、それは、シンボリックリンクを解決します。ショートカット名はターゲットと一致する必要さえありません。

そう:

$ ls -l ~/.shortcuts/
total 0
lrwxrwxrwx. 1 mattdm mattdm 16 Dec 17 19:44 tmp -> /home/mattdm/tmp
lrwxrwxrwx. 1 mattdm mattdm 17 Dec 17 19:44 WORK -> /home/mattdm/work
lrwxrwxrwx. 1 mattdm mattdm  8 Dec 17 19:44 www -> /srv/www
$ jd tmp
$ pwd
/home/mattdm/tmp
$ jd WORK
/home/mattdm/work

そして、追加の空想のために、jdパラメータなしで実行されたときにすべてのショートカットをリストします:

jd()
{
    if [[ -z "$1" ]]; then
      (cd ~/.shortcuts; stat -c '%N' *)
    else
      cd -P ~/.shortcuts/$1
    fi
}

注:後者は私にとって決して機能しないため、compgen -W $( cmd )代わりに使用しますcompgen -C 'cmd'。理由はわかりません。それは私自身の新しい質問かもしれません。:)


とても興味深い。ただし、jdで完了する前に、完全なリンクを入力するか、少なくとも曖昧でないリンクを入力する必要があります。エイリアスをjdコマンドに追加して短縮する方法はありますか?または、シンボリックリンクを格納できるディレクトリに相対するようにします。
dsollen

@dsollen更新を参照してください:)
mattdm

これは完璧に機能しました。正直なところ、私はこの質問に対する良い答えを期待していませんでしたが、これはまさに私が望んでいたものです。私はこれをかなり使用することを期待しており、新しいVMを取得するたびに変更するもののリストに追加するのに十分きれいだと感じています(標準的な環境の変更を新しいvm lolにクローンする自動化方法さえあります)。どうもありがとう。時間があれば、COMPREPLYの構文がどのように機能するかを理解します;)
dsollen

18

シェルエイリアスには、(通常はにバインドされている)名前補完(一部)を実行できる機能がありますtab。あるいは、このCDPATH機能を使用できます。この機能は、「最近」(過去5〜6年以内)に改良され、名前の補完がサポートされています。それがあなたのために働くなら、それはあなたがタイプするものがディレクトリのためのニーモニックではなくディレクトリの実際の名前であるという利点があります。

bashマニュアルによると

CDPATH
cdbuiltinコマンドの 検索パスとして使用される、コロンで区切られたディレクトリのリスト。

参考文献:


CDPATH環境変数について知りませんでした、ありがとう。私は加えるかもしれないgit_repos....その変数にディレクトリを
ワイルドカード

16

頻繁に使用するが毎日変更しないディレクトリについてはalias.bashrcファイルにいくつかのコマンドを追加するだけです。

alias cdo="cd /u01/app/oracle"
alias cdw="cd /var/www/html" 

友人はそれらの約50を持っています。一握りあります。早くて簡単。ただ

cdo

ディレクトリを/ u01 / app / oracleに変更するには


確かに。1990年代初頭からこのメカニズムを使用しています。
ウォリック

7

お勧めpushdpopdます。

個人的には、複数のディレクトリが関係する場合、開発作業を行ったりソースコードを読んだりするときに便利です。

スタック構造/ LIFOを効果的に実装し、ディレクトリをプッシュ(pushd)し、次のPOPディレクトリコマンド(popd)で取得します。

したがって、ディレクトリ内では次のようにします。

pushd .

そして、それを取得する必要があるとき、あなたは

popd

複数のpushd(s)を実行し、popd後で対応する(s)を実行して、ディレクトリに戻ることができます。

ここにリンクを残します。

http://www.eriwen.com/bash/pushd-and-popd/


1
これは、popdあまり使用しないことを除いて、私が使用するソリューションです。私は私の記入dirs(によって移入されたリストをpushd、私は時間のチャンクのために訪問/仕事にしたいすべてのディレクトリでコマンド)、その後、私は実行しますpushd +1。その後、非常に高速なシンプルな方法!puでディレクトリを循環できます。(UbuntuとCentOSの両方に、という注意されただけできれいにそれをインストール開始に利用できるコマンド。)pushdpu
ワイルドカード

3

それらを変数として変数に入れるだけ~/.bashrcで、その後は$離れてしまいます。

$ cat ~/.bashrc
if [ "$PS1" ]
then
    export myproj=~/todays/fancy/project
fi

$ cd $myproj

3

明らかな答えは変数です。これは、ファイルシステム内のシンボリックリンクと同様に、他のものを表すシェル内のシンボリックなものです。

path/to/project $ project=$PWD
path/to/project $ cd $elsewhere   # Previously created
path/to/elsewhere $ cd $project
path/to/project $ logout          # Variables gone, as required

適切なシェルでは、Tab変数名の補完が得られ、さらに役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.