bashのディレクトリ履歴はありますか?


26

bashのreverse-search-history(Ctrl-r)のようなものがありますが、ディレクトリ専用ですか?

ジャンプしたい深いフォルダー階層があるので、reverse-search-historyのようなものを使用したいのですが、フォルダー名のみを検索し、絶対パスを提供します。

基本的に、使用する場合と同様の結果が得られ!?ますが、一致するコマンドの前にcdが付いている場合のみ、結果と完全なパスをステップスルーできます。

これまでのところ、私が見つけた最良の解決策はbashmarksです。


1
私は最近zの使用を開始し、今のところうまくいくようですが、いくつかのパスで使用しました。
ロブ

回答:


11

見ていautojumpを

最も使用されるシェルコマンドの1つは「cd」です。友達の簡単な調査の結果、入力したコマンドの10〜20%が実際にcdコマンドであることがわかりました。残念ながら、cdを使用してシステムのある部分から別の部分にジャンプするには、ほぼ完全なパスを入力する必要がありますが、これはあまり実用的ではなく、多くのキーストロークが必要です。

autojumpは、ファイルシステムをナビゲートするためのより高速な方法です。コマンドラインから最もよく使用するディレクトリのデータベースを維持することで機能します。jumpstatコマンドは、データベースの現在の内容を表示します。データベースが使用可能になる前に少し作業する必要があります。データベースが十分に完成したら、次のように入力して、一般的な「cd」ディレクトリに「ジャンプ」できます。
j dirspec


ターミナルのタイトルに関する問題につながる可能性があります。
ダニエルベック

6

がある

cd -

これは、「cd [space] [hyphen]」コマンドであり、以前のディレクトリに移動します。本質的に「history of depth 1」です。2つのディレクトリ間を「cd-」で繰り返し切り替えます。

引用マニュアルページ:

次のオペランドがサポートされます:[...]

[ハイフン]がオペランドとして使用される場合、これはコマンドと同等になります。

      cd "$OLDPWD" && pwd

残念ながら、実際の組み込みのディレクトリ履歴は知りません。


pushd dir popdディレクトリの履歴スタックを保存できるペアがあります。これは、異なるフォルダで動作するスクリプトで非常に役立ちます。
-Jakuje

とを知ってpushdおりpopd、すでにここでも言及されています。
renergy

3

bashにはpushd / popd / dirsがあります。これを.bashrcに入れて、ディレクトリをbashのスタックに自動プッシュします。

#let cd also pushd directories into stack. Use popd to reverse stack
function cd ()
{
  if [ -e $1 ]; then 
    pushd $1 &> /dev/null   #dont display current stack 
  fi
}

これらを使用してポップし、使用popdしてスタックを表示しますdirs


2

私はZ-jumpの良い経験をしてきましたが、パスをステップスルーするのではなく、最終目的地に対してのみ完了できます。ただし、タブの完了時に完全なパスが表示されます。


1

私自身の経験でチャイムするために、私は少し前にこの要件に対処する簡単なスクリプトを書きました。それは新しいディレクトリの場所を履歴ファイルに追加するシンプルな関数で組み込みのcdコマンドを上書きし、次にpythonスクリプトが使用されますbashの逆コマンド検索のように、検索語を入力すると、ディレクトリの順序付きリストを動的に更新するbashインターフェイスを提供します。

好奇心are盛な人のためにgit-hubで入手できます。


ギアロイドのロック
ダースエグレジャス

1

ltcdディレクトリ履歴をすばやくナビゲートすることをお勧めします。

https://github.com/dczhu/ltcd

cdデモgif

生活を楽にする次の機能を提供します。

  • グローバルディレクトリリスト。すべてのターミナルタブ/ウィンドウから最近アクセスしたディレクトリを表示します。
  • ローカルdirリスト。現在のシェルセッションに対してローカルです。
  • どちらのリストも、j / k(ダウン/アップ)、数字、および単語検索を使用したクイックナビゲーションをサポートしています。
  • グローバルフリージャンプ(/ path / to / foo / bar / directory /に移動するには「cd dir」または「cd ar」など)。

1

bashで動作するoh-my-zshのコマンドと同様の機能を持つスクリプトを作成しました。oh-my-zshを使用したことがある場合は、ターミナルを終了するたびにコマンドによって提供されるディレクトリ履歴がリセットされることに気づいたかもしれません。ただし、このスクリプトを使用する場合は発生しません。dirs -vdirs -v

機能:

  • を使用して、最近使用した10個のディレクトリのリストを表示しdます。

  • リスト内のディレクトリの番号を入力して、リスト内の任意のディレクトリにジャンプします。10番目のディレクトリにジャンプするには、10ではなく0を使用する必要があります。

  • vvim)を使用してファイルを編集するかoxdg-open)を使用してそのディレクトリからファイルを開くたびに、ディレクトリパスがリストの先頭に配置されます。または、必要に応じて、ディレクトリにアクセスするたびに。

ここで実際に動作を確認できます


0

さて、このコードスニペットをに追加できます~/.bashrc

  1. カスタムcdコマンドを提供します

        function cd ()
        {
            exists=false
            for dir in "${CDHIST[@]}"; do
                [ "$dir" == "$1" ] && {
                    exists == true
                    break
                }
            done
    
            $exists || {
                len=${#CDHIST[@]}
                ${CDHIST[$len]} = "$1"
            }
    
            builtin cd "$1"
        }
    
  2. cd history searchコマンドを提供します。

    function cdhist ()
    {
        #TODO: Make this magical.
    
        for dir in "${CDHIST[@]}"; do
            echo "$dir"
        done
    }
    

もちろん、私が提供したcdhistコマンドは非常に基本的なものであり、必要なものではありません。しかし、caseステートメントまたはパラメーター拡張を使用して、必要なものに似たものを実現することも考えられます。

「Programmable completion」関数を追加することもできます。この関数を使用するcd /path/to/mydirと、の一意の部分文字列に基づいて完全なコマンドを追加できますが/path/to/unique/mydir、その方法ではを入力する必要がありますcd unique/mydir<tab>


1
私はあなたのコードを読み違え、bashのdirsコマンドを見つけました。このコマンドは、本質的my_dirsに1行で同じことを行います。
idbrii

1
クール。したがって、bashはそれをサポートするだけではありません。それを実装します。bashのディープマジックをもっと勉強する時間があればいいのにと思います。もちろん、これはpushdの記憶のみをサポートし、cdはサポートしません。しかし、私alias cd=pushdは最もエレガントな形になると思います。
jpaugh

0

あなたは、あなた自身の構築することができますcdを使用して、コマンドpushdpopddirs 組み込みコマンドを。

使用法

  • cd -- (現在の履歴をリストする)

  • cd -num (numディレクトリに移動します)

  • cd - (前のディレクトリに移動)


function cd()
{
    local hnum=16  # number of entries
    local new_dir index dir cnt
    if ! [ $# -eq 0 ]; then
        if [[ $# -eq 2 && $1 = "--" ]]; then
            shift
        else 
            if ! { [ $# -eq 1 ] && [[ $1 =~ ^(-[0-9]{,2}|-|--|[^-].*)$ ]] ;}
            then
                builtin cd "$@"
                return
            fi
        fi
    fi
    [ "$1" = "--" ] && { dirs -v;  return ;}
    new_dir=${1:-$HOME}
    if [[ "$new_dir" =~ ^(-[0-9]{,2}|-)$ ]]; then
        index=${new_dir:1}
        [ -z "$index" ] && index=1
        new_dir=$(dirs -l +$index) || return
    fi
    pushd -- "$new_dir" > /dev/null || return
    popd -n +$hnum &> /dev/null
    new_dir=$PWD cnt=1
    while dir=$(dirs -l +$cnt 2> /dev/null); do
        if [ "$dir" = "$new_dir" ]; then
            popd -n +$cnt > /dev/null
            continue
        fi
        let cnt++
    done
}

export -f cd

-1

このツールは、包括的なグローバルCLI履歴を保存するための以前のソリューションと、percol(C ^ Rにマッピング)と呼ばれる対話型greppingツールを組み合わせたものです。コマンドを実行した場所でコマンドを取得したり、コマンドでディレクトリを検索したりするために使用します。私が使い始めた最初のマシンではまだ滑らかで、2年以上前のCLI履歴があります。

grepツールはパスとコマンドの両方で機能しますが、それでも役立つ場合があります。zshの「dirs -v」も参照してください

https://github.com/gawells/ariadne


これは、パス、コマンド、および日付とともにCLI履歴を保存します。パスのみではありませんが、ディレクトリ履歴(bashとzsh)の逆検索に役立ちます
ゴードンウェルズ

ツールにリンクするのを忘れたと思います。あなたの説明から、コマンドが呼び出された場所からしか機能しないという点では不十分だと思います。したがって、cd share/manすでに/ usrにいる場合にのみ機能します。
idbrii

おっと!私の悪い、私はテキストにURLを入れたと思った、何かが間違っていることに気付かなかった
ゴードン・ウェルズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.