cdの履歴はありますか?


回答:


31

あなたが探しているコマンドがあるpushdpopd

あなたは実用的な作業例見ることができるpushdpopdから、ここを

mkdir /tmp/dir1
mkdir /tmp/dir2
mkdir /tmp/dir3
mkdir /tmp/dir4

cd /tmp/dir1
pushd .

cd /tmp/dir2
pushd .

cd /tmp/dir3
pushd .

cd /tmp/dir4
pushd .

dirs
/tmp/dir4 /tmp/dir4 /tmp/dir3 /tmp/dir2 /tmp/dir1

1
$OLDPWD同じコマンドを使用して2つのディレクトリ間を行き来したい場合もありますが、これがシェル固有およびディストリビューション/カーネル固有であるかどうかはわかりません。
mechalynx 14

4
@ivy_lynx OLDPWDはすべてのPOSIXシェルに存在しますが、それを超える方法を尋ねるこの質問には役に立たない(質問は既にcd -のショートカットであると述べているcd "$OLDPWD")。
ジル「SO-停止されて悪」

2
cd /tmp/dir1; pushd . ただの代わりに使用する理由はありますpushd /tmp/dir1か?
GnP 14年

@gnp、具体的な理由はありません。答えで言及したリンクから引用したものです。pushd /tmp/dir1うまく動作するはずです。
ラメシュ14年

1
OK、私の好奇心を選んだ。ディレクトリツリーを使用pushdpopdて前後にトラバースする実際の例を使用して、回答を改善することをお勧めします。あなたの答えはすでに正しいものです。
GnP 14年

53

使用しているシェルを指定しなかったので、これを口実にしてzshをアドバタイズします。

はい、より多くの履歴がcdあります。つまりcd -2cd -4などですcd -TAB。特に補完システムと色を有効にすると、非常に便利です。

これは私が.zshrcに持っているものです:

setopt AUTO_PUSHD                  # pushes the old directory onto the stack
setopt PUSHD_MINUS                 # exchange the meanings of '+' and '-'
setopt CDABLE_VARS                 # expand the expression (allows 'cd -2/tmp')
autoload -U compinit && compinit   # load + start completion
zstyle ':completion:*:directory-stack' list-colors '=(#b) #([0-9]#)*( *)==95=38;5;12'

そして結果:

ここに画像の説明を入力してください


4
バッシュバッシュバッシュバッシュ
ティム14

7
OK、私はこの答えを削除しません、多分他の人に役立つでしょう。
jimmij

23
質問がについて具体的に尋ねない限りbash、これは有効な答えです。削除しないでください。
リオリ14

OPが質問を編集してbashのみを含める場合、この回答はまだ有効ですか?
オーカー14

3
を除いてsetopt AUTO_PUSHD、上記のセットアップはいずれも、在庫zshで完了した遍在するディレクトリスタックを取得するために必要ではないことに言及する必要あります。および(好みの問題)PUSHD_MINUSの意味を逆にし、ディレクトリスタックとは無関係です。ここでの呼び出しは、ディレクトリスタックの完了の出力に色を追加するだけです。ただし、完了サブシステムをで初期化する必要があります。cd +cd -CDABLE_VARSzstyleautoload -U compinit && compinit
wjv

13

「より多くの歴史」に関する質問に答えるため。いいえ、cd -Bash の機能は、「フリップ」できる単一のディレクトリのみをサポートします。@Rameshが彼の答えで述べているように。ディレクトリのより長い履歴が必要な場合は、pushdpopdを使用してディレクトリを保存するか、前のディレクトリに戻ることができます。

dirsコマンドを使用して、現在スタックにあるもののリストを表示することもできます。

詳細な説明は、「pushdおよびpopdコマンドを使用するにはどうすればよいですか?」というタイトルのこの回答から見つけることができます。


私はあなたの答えからの参照を含めました。気にしないでください。:)
ラメシュ14

@Ramesh-いいえ。
slm

8

bash用のdirhistoryユーティリティをインストールして使用できます。

基本的に、これはすべてのシェルからディレクトリの変更を収集するデーモンであり、履歴を表示し、切り替えるディレクトリを選択できるCdkプログラムです(スタックに限定されません)。


7

必要なだけの履歴があります:

cd() {
[ "$((${DIRSTACKMAX##*[!0-9]*}0/10))" -gt 0 ] &&
        set -- "$@" "$DIRSTACK"               &&
        DIRSTACK='pwd -P >&3; command cd'     ||
        { command cd "$@"; return; }
_q()    while   case "$1" in (*\'*) :   ;;      (*)
                ! DIRSTACK="$DIRSTACK '$2$1'"   ;;esac
        do      set -- "${1#*\'}" "$2${1%%\'*}'\''"
        done
while   [ "$#" -gt 1 ]
do      case    ${1:---} in (-|[!-]*|-*[!0-9]*) : ;;
        (*)     eval "  set $((${1#-}+1))"' "${'"$#}\""
                eval '  set -- "$2"'" $2"'
                        set -- "${'"$1"'}" "$1"'
        ;;esac; _q "$1"; shift
done
eval "  DIRSTACK=; $DIRSTACK    &&"'
        _q "$OLDPWD"            &&
        DIRSTACK=$DIRSTACK\ $1
        set "$?" "${DIRSTACK:=$1}"'" $1
"       3>/dev/null
[ "$(($#-1))" -gt "$DIRSTACKMAX" ] &&
        DIRSTACK="${DIRSTACK% \'/*}"
unset -f _q; return "$1"
}

これは、POSIX互換シェルがzsh-style cd履歴を提供できるようにするシェル関数です。単一のサブシェルを呼び出さずにすべての作業を実行します。その流れはかなり健全だと思います。中程度のテストですべてのケースを正しく処理するようです。

この関数は、完全に移植可能な構文に依拠しながら、環境をできるだけうまく再生しようとします。これは、1つの仮定のみを行い、$DIRSTACK環境変数がそのプロパティであるということです。

格納するすべてのパスを正規$DIRSTACK化し、それらをすべて単一引用符でシリアル化します-ただし、変数の値に追加する前にそれぞれが安全に引用され、シリアル化されていることを保証し、どんな種類の特殊文字にも問題がないはずです。$DIRSTACKMAX環境変数が設定されている場合、履歴に保持するパスの数の上限として使用されます。それ以外の場合、制限は1です。

関数をロードする場合cd、通常どおりcd -[num]、変更ディレクトリの履歴をさかのぼって戻すこともできます。

関数の主要なメカニズムは、cdそれ自体と${OLD,}PWD環境変数です。POSIXでは、cdパスの移動ごとにこれらを変更するように指定されているため、シェルの組み込み変数を使用し、必要な限り値を保存します。


@datUser-誰かがデータを持っていることを知っていました。ようこそ
mikeserv

4

acd_func.shのスクリプトは、あなたが記述まさにありません。基本的に、cd関数をオーバーロードし、cd --以前にアクセスしたディレクトリのリストを取得するために入力することができます。リストから番号で選択できます。これなしでbashを使用するのは非常に難しく、新しいシステムに最初にインストールするのは難しいと思います。



3

他の人はすでにいくつかの興味深いソリューションを扱っています。少し前に、「ストレートヒストリー」を実行するためにすばやく修正できる関連する問題に対する独自のソリューションを作成しました。私は基本的に、一般的に使用されるいくつかのディレクトリに「ラベル」を付け、開いているすべてのシェルにそれらを表示させ、再起動間でそれらが保持されるようにしました。

#dir_labels
#functions to load and retrieve list of dir aliases

function goto_complete {
    unset dir_labels
    declare -A dir_labels
    {
    while read line; do
        ll_pre="${line%% *}"
        ll_dir="${line#* }"
        dir_labels["$ll_pre"]="$ll_dir"
    done
    } < ~/.dir_labels
    unset ll_pre
    unset ll_dir

    local cur possib
    cur="${COMP_WORDS[COMP_CWORD]}"
    possib="${!dir_labels[@]}"
    COMPREPLY=( $(compgen -W "${possib}" -- ${cur}) )
}

complete -F goto_complete goto

function goto {
    unset dir_labels
    declare -A dir_labels
    {
    while read line; do
        ll_pre="${line%% *}"
        ll_dir="${line#* }"
        dir_labels["$ll_pre"]="$ll_dir"
    done
    } < ~/.dir_labels
    unset ll_pre
    unset ll_dir

    if [ $# -gt 0 ]; then
    key="$1"
    else
    key=default
    fi
    target="${dir_labels[$key]}"
    if [ -d "$target" ]; then
    cd "$target"
    echo "goto $key: '$target'"
    else
    echo "directory '$target' does not exist"
    fi
}

function label {
    unset dir_labels
    declare -A dir_labels
    {
    while read line; do
        ll_pre="${line%% *}"
        ll_dir="${line#* }"
        dir_labels["$ll_pre"]="$ll_dir"
    done
    } < ~/.dir_labels
    unset ll_pre
    unset ll_dir

    if [ $# -gt 0 ]; then
    target="$1"
    else
    target="default"
    fi
    dir_labels["$target"]=$PWD
    for i in "${!dir_labels[@]}"; do
    echo "$i ${dir_labels[$i]}"
    done > ~/.dir_labels
}

基本的にはlabel foo、現在のディレクトリを呼び出してfooから、goto fooそこcdにあるシェルから直接呼び出します。空の引数:labelのデフォルトターゲットを作成しますgoto

エイリアスの自動削除の実装は気にしませんでしたが、それ以外の場合は、少し変更した形でこれを使用しています。


2

http://fex.belwue.de/fstools/bash.htmlから「cd history」機能を使用できます。

これまでに行ったすべてのディレクトリが記憶され、「cdh」を使用すると、最後の9つのディレクトリのリストが表示されます。番号を入力するだけで、このディレクトリに戻ります。

例:

framstag @ wupp:/:cdh
1:/ usr / local / bin
2:/ var
3:/ /
4:/ tmp / 135_pana / 1280
5:/ tmp / 135_pana
6:/ tmp / weihnachtsfeier
7:/ tmp
8:/ local / home / framstag
選択:4
framstag @ wupp:/ tmp / 135_pana / 1280:

cdhは「cdなしのcd」とも呼ばれるautocdで動作します。cdやpushdを入力する必要はありません。


2

拡張された「cd」機能をお勧めします。

https://github.com/dczhu/ltcd

ここに画像の説明を入力してください

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

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

うーん、有望に見えます。確認してみます。
ddnomad

1

以下のためのbashの、基本的には:代わりにCDの使用を使用してのpushd(スタックを意味します)、それらが保存されているので、directorysを変更します

pushd /home; pushd /var; pushd log

スタックの使用状況を確認し、dirsナビゲーションを簡単にするには(「スタックエントリ」の番号を取得するには:

dirs -v

出力:

me@myhost:/home$ dirs -v
 0  /home
 1  /var
 2  /tmp

今でこれらの番号を利用cdして~のように:

cd ~1

しかし、現在これらの番号は再配置され、位置 "0"が変更されるためpushd、ディレクトリはトップ位置に2回だけ移動します(または、位置0にダミーを使用します)。

me@myhost:/home$ dirs -v
 0  /home
 1  /home
 2  /var
 3  /tmp

今、1..3は私がどこかでこれを読んだ位置維持し ますが、もう知らないので、クレジットを与えないで申し訳ありません

(スタックから現在のディレクトリを解放する/履歴から削除するpopd


1

312ページの「シェルプログラミング、4e」のcdh関数を参照してください。この関数は、履歴を配列に保持します。

より高度なバージョンは次のとおりです。https//drive.google.com/open?id = 0B4f-lR6inxQWQ1pPZVpUQ3FSZ2M

履歴をCDHISTFILEファイルに保存し、文字列を含む最新のディレクトリに変更できます。たとえば、

cd -src

既存のcdコマンドの上に、次のコマンドを実行してインストールします。 alias cd=_cd


1

可能な解決策としてfzfマークを追加したかっただけです。

インストールすると、ブックマークされたディレクトリを追加して検索するためのコマンドマークジャンプが提供されます(はい、完全に履歴ではなく、自分でブックマークしたディレクトリだけです)。

pushd / popd itセッション固有の動作に関する問題、つまり、異なるbashセッションで同じスタックを使用したい、またはfzf-marksで可能な問題です。


0

@mikeservが出した答えを試してみましたが、私にはうまくいきませんでした。私はそれを修正する方法を理解できなかったので、私は自分で書いた:

cd() {
    # Set the current directory to the 0th history item
    cd_history[0]=$PWD
    if [[ $1 == -h ]]; then
        for i in ${!cd_history[@]}; do
            echo $i: "${cd_history[$i]}"
        done
        return
    elif [[ $1 =~ ^-[0-9]+ ]]; then
        builtin cd "${cd_history[${1//-}]}" || # Remove the argument's dash
        return 
    else
        builtin cd "$@" || return # Bail if cd fails
    fi
    # cd_history = ["", $OLDPWD, cd_history[1:]]
    cd_history=("" "$OLDPWD" "${cd_history[@]:1:${#cd_history[@]}}")
}

これはGitHub Gistとしても利用できます。これを使用するには、関数を自分.bashrcまたは同様のものに貼り付けるだけで、過去cd -55 番目のディレクトリに戻ることができcd -hます。履歴の概要が表示されます。

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