web-dev-qa-db-ja.com

bashシェルでの迅速なディレクトリナビゲーション

/Project/Warnest/docs/~/Dropbox/Projects/ds/test/など、まったく関係のないパスにあるディレクトリを頻繁に切り替えたい。

しかし、いつもcd /[full-path]/を入力したくありません。以前に機能していたディレクトリに切り替えるショートカットコマンドはありますか?

考えられる1つの解決策は、頻繁に使用されるディレクトリの環境変数をbash.profileに追加し、それらの変数を使用してそれらにcdを追加することです。

しかし、これに対する他の解決策はありますか?

121
saiy2k

2つのディレクトリを切り替えるだけの場合は、cd -を使用して前後に移動できます。

136
Chris Card

シェル変数CDPATHbashにあり、kshcdpathzshにあります。

CDPATH    The search path for the cd command. This is a colon-separated
          list of directories in which the Shell looks for destination
          directories specified by the cd command.

だから〜/ .bashrcで設定できます:

export CDPATH=/Project/Warnest:~/Dropbox/Projects/ds

次にcd docsおよびcd testは、最初に見つかったそのようなディレクトリに移動します。 (つまり、同じ名前のディレクトリが現在のディレクトリに存在する場合でも、CDPATHは引き続き参照されます。CDPATHに、指定した名前のサブディレクトリを持つディレクトリがさらに含まれる場合、最初の1つが使用されます。)

64
manatwork

他に試してみるとよいのは autojump というツールです。エイリアス(デフォルトではj)への呼び出しのデータベースを保持し、行きたい場所についてインテリジェントな決定を試みます。たとえば、頻繁に入力する場合:

j ~/Pictures

以下を使用して、ピンチに到達できます。

j Pic

DebianとUbuntuで利用でき、デフォルトでユーザーごとに~/.bashrcまたは~/.zshrcに含まれています。

51
Kyle Smith

ディレクトリの数が少ない場合は、pushdを使用してディレクトリ間をローテーションできます。

# starting point
$ pwd
/Project/Warnest/docs
# add second dir and change to it
$ pushd ~/Dropbox/Projects/ds/test
~/Dropbox/Projects/ds/test /Project/Warnest/docs
# prove we're in the right place
$ pwd
~/Dropbox/Projects/ds/test
# swap directories
$ pushd
/Project/Warnest/docs ~/Dropbox/Projects/ds/test

cd -とは異なり、これは3つ以上のディレクトリで使用できます


Noachの提案に従って、私は今これを使っています:

function pd()
{
    if [[ $# -ge 1 ]];
    then
        choice="$1"
    else
        dirs -v
        echo -n "? "
        read choice
    fi
    if [[ -n $choice ]];
    then
        declare -i cnum="$choice"
        if [[ $cnum != $choice ]];
        then #choice is not numeric
            choice=$(dirs -v | grep $choice | tail -1 | awk '{print $1}')
            cnum="$choice"
            if [[ -z $choice || $cnum != $choice ]];
            then
                echo "$choice not found"
                return
            fi
        fi
        choice="+$choice"
    fi
    pushd $choice
}

使用例:

# same as pushd +1
$ pd 1

# show a Prompt, choose by number
$ pd
 0 ~/Dropbox/Projects/ds/test
 1 /Project/Warnest/docs
 2 /tmp
? 2
/tmp ~/Dropbox/Projects/ds/test /Project/Warnest/docs

# or choose by substring match
$ pd
 0 /tmp
 1 ~/Dropbox/Projects/ds/test
 2 /Project/Warnest/docs
? doc
/Project/Warnest/docs /tmp ~/Dropbox/Projects/ds/test

# substring without Prompt
$ pd test
~/Dropbox/Projects/ds/test /Project/Warnest/docs /tmp

明らかに、これはスタックを循環するためだけのものであり、新しいパスの追加を処理しません-名前を変更する必要があるかもしれません。

40
Useless

これらのCDを作成するために、bashrcでaliasを使用します。
といった:

alias wdoc='cd ~/Project/Warnest/docs'
alias dstest='cd ~/Dropbox/Projects/ds/test'
15
Felix Yan

この問題を解決するスクリプト(通常はacd_funch.shと呼ばれます)を見つけました。これを使用すると、cd --と入力して、使用した最後の10個のディレクトリを表示できます。次のようになります。

0  ~/Documents/onedir
1  ~/Music/anotherdir
2  ~/Music/thirddir
3  ~/etc/etc

~/Music/thirddirに移動するには、単にcd -2と入力します

参考文献

注:このスクリプトは、最初にLinuxガゼットの記事で公開されていました。こちらから入手できます。 acd_func.sh-bashのCDを拡張して保持します。訪問したディレクトリ名の表示とアクセス履歴

12
Dean

"pushd -n"を使用します(bashを使用する場合)。

〜/ .bashrcに追加:

pushd -n /Project/Warnest/docs/
pushd -n ~/Dropbox/Projects/ds/test/

その後、

cd ~はあなたの家です。

cd ~1~/Dropbox/Projects/ds/test/です

cd ~2/Project/Warnest/docs/です

~1とまったく同じ方法で~2~などを使用できます。

11
Eelvex

Bashでcdable_vars Shellオプションを試してください。 shopt -s cdable_varsでオンに切り替えます。

次に、変数export dir1=/some/pathを設定する必要があります。そして最後にcd dir1などです。次に、それを~/.bashrcに入れて固定できます。

11
Wojtek

ここにはたくさんの良い提案があります。どちらを使用するかは、切り替えるディレクトリの小さな固定リストがあるかどうか、またはより一般的なソリューションを探しているかどうかによって異なります。

それが小さな固定リストである場合は、(Felix Yanが示唆したように)単純なエイリアスを設定するのが最も簡単です。

より一般的なソリューション(つまり、時間の経過とともに変化する多くの異なるディレクトリ)を探している場合は、pushdとpopdを使用します(Uselessが推奨)。個人的には、デフォルトのpushd/popdは使いにくいと感じています。特に、多くのフォルダー間で切り替えを開始する場合はそうです。しかし、私はそれをはるかに簡単にするいくつかの微調整を書きました。以下をbashrcに追加してください:

alias dirs='dirs -v'
pd () 
{ 
    if [ -n "$1" ]; then
        pushd "${1/#[0-9]*/+$1}";
    else
        pushd;
    fi > /dev/null
}
  • pdpushdの短縮形)を使用して、どこにいたかを覚えて新しいフォルダにジャンプします。
  • 保存されたディレクトリのリストを表示するには、dirsを使用します。
  • 使用する pd 3は、ディレクトリ番号3にジャンプします。

使用例:

$ PS1='\w\$ '   ## just for demo purposes
~$ pd ~/Documents/data
~/Documents/data$ pd ../spec
~/Documents/spec$ pd ~/Dropbox/Public/
~/Dropbox/Public$ pd /tmp
/tmp$ pd /etc/defaults/
/etc/defaults$ dirs
 0  /etc/defaults
 1  /tmp
 2  ~/Dropbox/Public
 3  ~/Documents/spec
 4  ~/Documents/data
 5  ~
/etc/defaults$ pd 2
~/Dropbox/Public$ dirs
 0  ~/Dropbox/Public
 1  ~/Documents/spec
 2  ~/Documents/data
 3  ~
 4  /etc/defaults
 5  /tmp
~/Dropbox/Public$ pd 4
/etc/defaults$ dirs
 0  /etc/defaults
 1  /tmp
 2  ~/Dropbox/Public
 3  ~/Documents/spec
 4  ~/Documents/data
 5  ~
/etc/defaults$ pd 3
~/Documents/spec$ popd
~/Documents/data ~ /etc/defaults /tmp ~/Dropbox/Public
~/Documents/data$ 
8
Noach

j2 を試してみるよりも悪い結果になる可能性があります。

READMEから:

複雑なディレクトリツリーの周りでcd-ingに多くの時間を費やしていますか?

jは、どこに行ったか、そこに費やした時間を追跡し、実際に使用しているディレクトリにジャンプする便利な方法を提供します。

幅広く使ってお勧めします。

7
phildobbin

以下は、私がテストした1つのケースで機能するように見え、ディレクトリ名をシンボリックリンクとして〜/ Bookmarksにドロップできます。

mkdir "$HOME/Bookmarks"
ln -s /tmp "$HOME/Bookmarks/testdir"

function ccd() { cd $(readlink "$HOME/Bookmarks/$1") ; }

ccd testdir && echo $PWD
# gives /tmp
7
Ulrich Schwarz

私の経験では、シェル内を移動する際の最大のスピードアップは、その履歴検索機能を使用することです。 Bashでは、Ctrl + Rを押してコマンドの履歴を逆方向に検索し、何らかのパターンを入力できます。次に、そのパターンが履歴内の以前のエントリ(cdコマンドまたはその他の操作)と照合され、入力と同時に提案が行われます。 Enterキーを押すだけで、提案されたコマンドが再度実行されます。これはBashではreverse-search-historyと呼ばれ、大好きです。それは私に多くのキーストロークを節約し、私の内部メモリを節約します。

2つの履歴エントリcd ~/Dropbox/Projects/ds/test/cd /Project/Warnest/docs/を区別するために、DropWaなど、コマンドの一部を覚えるだけでよいので、これは良いことです。

6
user13742

私はこれらのエイリアスも使用しています(〜/ .bashrcに追加します):

alias ..='cd ..'
alias ...='cd ../..'
alias ....='cd ../../..'
alias .....='cd ../../../..'

それらと一緒に上位ディレクトリに移動する方がはるかに高速です(ただし、ナビゲーションの半分しか解決されません)。

6
reimai

zsh を使用することをお勧めします。このシェルは、ディレクトリ、ファイル、およびほとんどのcliプログラムのオプションでさえ、非常に優れたTAB補完機能です。

私は何年もそのシェルを使用してきましたが、それがなくなってしまった場合は機能性を見逃してしまいます。 zshのスクリプト作成も非常に楽しいです。毎日役立つ one-liners が多数あるからです。

6
polemon

zshを使用している場合:

  • cdと入力する必要はありません。ディレクトリパスを入力するだけです(/foo/bar/baz<Enter>cd /foo/bar/baz<Enter>と等しい)

    auto_cd オプションを設定する必要があります

  • Tabキーで短縮パスを展開できます(/u/sh/pi<Tab>/usr/share/pixmapsに展開されます。ファイル名でも機能します)
5
Andrei Dziahel

とにかく、絶対にシェルに絶対パスを入力するべきではありません。いつでも使用できます:

soffice /P*/W*/*/mydoc*

の代わりに

soffice /Project/Warnest/docs/mydoc.odt
4
gena2x

ディレクトリをすばやく変更するためのかなり良いツールがあります:

xd-eXtra高速ディレクトリチェンジャー http://xd-home.sourceforge.net/xdman.html

少し厄介なのは、ディレクトリをoutputsディレクトリだけとして、bashプロファイルなどにマッピングする必要があることです。

# function to do `cd` using `xd`
# -g turns generalized directory search command processing on
# which improves the whole thing a bit
f() 
{
        cd `/usr/bin/xd -g $*`
}

次のようなことができます:

# change to /var/log/a* (gives you a list to choose from)    
f vla
# to skip the list and go directly to /var/log/Apache2
f vlapach
4
null

cdargsは、ディレクトリをブックマークするための最も効率的なツールです。 http://www.youtube.com/watch?v=uWB2FIQlzZg

3
Emon

同じ質問があり、最初に この答え が見つかりました。ユーティリティz( https://github.com/rupa/z )をインストールしました。

Zはcdコマンドから学習し、frecencyの原則(頻繁に&最近)に従ってディレクトリを追跡するため、これはまさにあなたが探しているものです。 。したがって、両方のcdコマンドを一度実行すると、次のように実行できます。

z docs
z ds

/Project/Warnest/docs/~/Dropbox/Projects/ds/test/にそれぞれジャンプします。 zの引数は正規表現であるため、完全なフォルダー名を入力する必要すらありません。

3
saroele

更新(2016):これで [〜#〜] fasd [〜#〜] を使用して、ファジーを許可します最新のディレクトリに基づいて検索します。


このためのツールをRubyで作成しました。 YAMLファイルを使用してプロジェクトを宣言できます。

私はそれについてここに少し記事を書きました: http://jrnv.nl/switching-projects-terminal-quickly/

ソースもGitHubに投稿しました: https://github.com/jeroenvisser101/project-switcher

3
jeroenvisser101

このために特別に作成された「wcd」アプリもあります(私もそれに参加しているため、cygwinにも移植されています)。ショートカット、dirsのブックマークを作成できます。ワイルドカードもサポートしています。/usr/share/wcdのmanページとドキュメントを読むことは非常に役立つはずです。

http://manpages.ubuntu.com/manpages/hardy/man7/wcd.7.html

3
sam

Fastcdを試す( https://github.com/frazenshtein/fastcd )訪問したディレクトリをbashから記録するフックを設定します。そして、スクリプトを "j"エイリアスとして設定します。これは、最後にアクセスしたディレクトリを示し、すばやくcd(入力を開始してディレクトリをフィルタリング)する機能を備えています。 「j」エイリアスを作成するには、.bashrcの変更が必要です。

取得ツール

cd ~; mkdir Soft; cd Soft
git clone https://github.com/frazenshtein/fastcd

必要なモジュールをインストールする

pip install --user urwid

Set.shファイルをbashrcに読み込みます

echo -e "\nsource /home/$USER/Soft/fastcd/set.sh\n" >> ~/.bashrc

そしてbashrcを更新する

source ~/.bashrc

次に、コンソールで「j」と入力します

3
Sam Toliman

IEEE 1003.1(POSIX)によると、OLDPWDが作業ディレクトリを変更するたびに、以前の作業ディレクトリで更新する必要がある環境変数cdもあります(興味深いものについては、80244行目) IEEE 1003.1-2008のページ2506の)。

3
njsg

私は自分のユーティリティ cdhist を使用して、これを長年管理しています。 cdコマンドのエイリアスを作成し、ディレクトリスタックを自動的に保持します。

2
bulletmark

exportを使用して、ディレクトリパスを変数に割り当て、それらを参照できます。

export dir1=/Project/Warnest/docs/
export dir2= ~/Dropbox/Projects/ds/test/
cd $dir1
cd $dir2
2
Fahad Naeem

ancは、ディレクトリのブックマークを保持するコマンドラインツール(アンカーの略)です。 (これまでのところbashでのみテスト済み)

あなたの場合:

anc a /Project/Warnest/docs/ ~/Dropbox/Projects/ds/test/

これは両方のディレクトリをアンカー(ブックマークと考えます)リストに追加します

ここで、システムタイプのどこからでも/Project/Warnest/docs/にジャンプする場合は、次のように入力します。

anc Warn

~/Dropbox/Projects/ds/test/にジャンプする場合は、次のように入力します。

anc ds test

ブックマークされたパスに対してテキストを照合することとは別に、ancには、ディレクトリを移動するための他の多くの便利な方法があります。

anc i

すべてのブックマークを番号順に一覧表示するインタラクティブモードを開始するため、入力する必要があるのは番号だけです

入力した場合:

anc Pro[TAB]

すべてのブックマーク(この場合は両方のブックマーク)に一致するリストが表示され、矢印キーを使用してリストから選択できます。これは非常に迅速かつ直感的な方法です。

プロジェクトのgithubページでancを取得します: https://github.com/tobimensch/anc

READMEの使用例もあります。

完全な開示:私はこのスクリプトの作成者です。一部の人に役立つと思います。

1
tobimensch

pushdpopdは先見性を必要とするため、私は好きではありませんでした。それをねじ込んで、最後のいくつかのディレクトリを自分で追跡し、cd-to-old-dirs関数でそれらを使用できるようにします。それをcdoと呼びます。これをrcファイルに入れます(例:~/.bashrc):

function precmd() { __path_log; }    # to install in zsh, harmless in bash
Prompt_COMMAND="__path_log"          # to install in bash, harmless in zsh

# Populate the array DIRHIST with the last 8 dirs visited (not for direct use)
__path_log() {
  local d dh first=true
  if [ -d "$__DIRHIST" ] && [ "$__DIRHIST" != "$PWD" ]; then
    # $__DIRHIST is the last dir we saw, but we miss foo in 'cd foo; cd bar'
    # so we use $OLDPWD to catch it; so you'd need a THIRD change to fool us.
    for d in "$__DIRHIST" "${DIRHIST[@]}"; do
      if [ -n "$first" ]; then unset DIRHIST first; DIRHIST[1]="$OLDPWD"; fi
      if [ "$OLDPWD" = "$d" ] || [ "$PWD" = "$d" ] || [ ! -d "$d" ]; then
        continue
      fi
      dh=$((1+${#DIRHIST[@]}))
      [ $dh -lt 9 ] && DIRHIST[$dh]="$d" # Push up to 8 directories
    done
  Elif [ -z "$__DIRHIST" ]; then
    DIRHIST[1]="$OLDPWD"
  fi
  __DIRHIST="$PWD"
}

cdo() {
  local d n=0
  if [ -z "${DIRHIST[1]}" ] || [ -z "$1" ]; then
    cd ${OLDPWD+"$OLDPWD"}
    return $?
  fi
  case "$1" in
    ls )   for d in "${DIRHIST[@]}"; do echo "$((n=n+1)) <$d>"; done \
             |sed "s:<$HOME:<~:;s:</home/:<~:" |column \
             |GREP_COLORS='ms=0;32' grep --color -e '\b[0-9] <' -e '>' ;;
    [1-9]) cd "${DIRHIST[$1]}" ;;
    * )    [ -d "$1" ] && cd "$1" || echo "Usage: cdo [NUM|ls]" >&2; return 2 ;;
  esac
}

次の例では、ハッシュディレクトリdollar(# dir $)、スタックオーバーフローによりプロンプトが灰色になるため選択されました:

# ~ $ cd /tmp
# /tmp $ cdo
# ~ $ cdo ls
1 </tmp>
# ~ $ cd /
# / $ cdo ls
1 </home/adam>  2 </tmp>
# / $ cdo
# ~ $ cdo ls
1 </>   2 </tmp>
# ~ $ cdo 2
# /tmp $ cd test
# /tmp/test $ cd ../test2
# /tmp/test2 $ cdo ls
1 </tmp/test>   3 </home/adam>
2 </tmp>        4 </>
# /tmp/test2 $ cdo 4
# / $ cd
# ~ $ cdo ls
1 </>           3 </tmp/test>
2 </tmp/test2>  4 </tmp>

他の人たちが私と同じ一般的な考えを持っているのを見るのは本当に素晴らしいです(私は私がオリジナルだったと思いました!)。 @SamTrolimanによる fastcd 、@ nullの xd 、@ phildobbinの j2 への言及はすべて非常によく似ています。 重複した質問84445 も参照してください。これには setopt auto_pushd 。私は今でも自分のコードを好みますが、ymmvです。

1
Adam Katz

必要なのは、基本的にはワークフローのプロジェクトファイルのようです。プログラミングIDEのように、アクティビティに属するディレクトリを使用します。 Zsh Navigation Toolsn-cdというツールを試してみてください。それはあなたが最後に訪れたフォルダをナビゲートし、またあなたが選んだディレクトリでHotlistを定義することを可能にします:

n-cd

n-cdは、次のキーの組み合わせにバインドできます。

zle -N znt-cd-widget

bindkey "^ T" znt-cd-widget

1
Adam Lisson

この状況で使用する解決策はscreenです。画面を開始し、C-a cを使用して各ディレクトリのウィンドウを作成し、そこに移動します。 C-a nまたはC-a pでウィンドウ/ディレクトリを切り替えます。ウィンドウにC-a Aという名前を付けます。次に、C-a "を使用してウィンドウのリストをポップアップし、ウィンドウ番号または名前を使用して移動できます。 screenであるため、セッションから切断して作業スペースを節約し、後で同じ設定で再接続できます。

1

TL; DR

  1. Fishを使用すると、インタラクティブなシェルがすぐに機能します(fish> zsh> bash)。
  2. POSIX/Bash for scriptingを使用してください。これは、最も広くサポートされている構文です(POSIX> Bash> Zsh> Fish)。

シェル

ここでさまざまなシェルをテストしたことが私のフィードバックです(テスト/採用の順序):

  • Bash
    • 自動補完:基本;
    • パス拡張:いいえ;
    • スクリプト:すばらしい。
  • Zsh + oh-my-zsh
    • オートコンプリート:良好(循環)。
    • パス拡張:はい(cd /e/x1cd /etc/X11/);
    • スクリプティング:良い。
  • Fish + oh-my-fish (current)は、箱から出してすぐに最高です:
    • オートコンプリート:ネイティブおよびサポートされるオプション。
    • パス拡張:はい;
    • スクリプト:POSIX互換との違いが多すぎます。

意味のあるエイリアスを使用する

すべてのシェルはfunctionaliasを使用して拡張できます。これは、問題に関連して私が使用するものです(POSIX互換)。

back () {  # go to previous visited directory
        cd - || exit
}

up () {  # go to parent directory
        cd ..|| exit
}

基本的ですが、本当に意味がありとても覚えやすく、オートコンプリートがあります。

シェルを知る

CDPATHを設定して、最もよく使用するディレクトリを追加します(例:~/projects//etc/init.d/)なので、すばやくジャンプできます。

CDPATHのmroeの詳細については、manatworkの回答 を参照してください。

ハングアウトして読む

1
Édouard Lopez

ここにいくつかの提案:

最も直接的なアイデアは、.profileファイルにエイリアスを追加することです

vi ~/.profile
alias dir1='cd /myhome/onedir'
alias dir2='cd /jimmy/anotherdir'

次に$ dir1またはdir2を使用して、cdできます

常に2つのdirsのみを切り替える場合。 cd -を使用すると、それらが切り替わります。

1
Dan

そのためのスクリプトを作成しました。これが Githubへのリンク です。

次に使用例を示します。

最初にpev変数を追加しましょう:

$ pev add longpath '/A/very/very/long/path/I/frequently/need'
# output:
# environment variable "pev_longpath" added successfully. "pev show" to see the list of pev variables.

これまでに定義したpev変数のリストを見てみましょう:

$ pev show
# output:

  |   NAMES          VALUES
  |   ----------     ----------
  |   pev_longpath   "/A/very/very/long/path/I/frequently/need"

次に、そのディレクトリに移動します。

$ cd $pev_longpath

または、そのサブディレクトリの1つに何かをコピーします。

$ cp somefile $pev_longpath/and/deeper/than/that

実際、pev変数は他の環境変数と何の違いもありません。おそらく管理が簡単です。私はシェルスクリプトの経験があまりないので、遠慮なく私のエラーを教えてください。 HTH。

0
aderchox

あなたの基準に基づいて、~/.bashrcで頻繁に使用されるパスごとにaliasを定義するだけでよいと思います。私はこの方法を個人的に使用しています。

alias taxes='cd /users/bob/documents/home/finances/taxes'
alias elvis='cd /dropbox/2016/files/music/elvis'

関連する質問( link )で述べたように、ディレクトリツリーを下に戻って元に戻りたい場合は、..が私のお気に入りです。 .. 1つのディレクトリを上に移動して../.. 2および../../.. 3を移動するなどして、ツリーのブランチ内を簡単に移動できます。同じコマンドを使用して、別のブランチを上下に移動することもできます。 、たとえばcd ../../exampleまたはcd ../../../example/exampleなど。ディレクトリ間を行き来する簡単なスイッチの場合、cd -または$OLDPWDが最善の策です。

0
Adam Erickson

Bashおよびzsh端末での迅速なディレクトリナビゲーションのための断然最良のソリューションは、インストール z-ジャンプ スクリプトです。この必須のスクリプトは、Google Chrome Devtools開発者、Paul Irishの 2013 Fluent基調講演 で推奨されています。私はそれなしでは生きられません。

DESCRIPTION 'frecency'に基づいて、最もよく使用されるディレクトリを追跡します。

短い学習フェーズの後、zは、コマンドラインで指定されたすべての正規表現に順に一致する最も「最新の」ディレクトリに移動します。

例えば、 z foo barは/ foo/barに一致しますが、/ bar/fooには一致しません。

[...]

Frecencyは「最近」と「頻度」の組み合わせです。

0
Alxs

アトミックの作業ディレクトリ(wd)はこれに適したパッケージのようです: https://github.com/karlin/working-directory

0
saiy2k

2つのbash関数を実装しました。

cdh(cd履歴):最後の9つのディレクトリを自動的に記憶します。番号を入力すると、そのうちの1つに戻ることができます。

cdb(cdブックマーク):現在のディレクトリに任意の文字を割り当て、後でこの文字を入力してこのディレクトリに移動できます。

cdhとcdbはどちらもautocd(別名 "cd witout cd")で動作します。

http://fex.belwue.de/fstools/bash.html を参照してください

0
Framstag