上に移動する代わりに前のディレクトリに変更するにはどうすればよいですか?


214

現在、私は多くの作業時間を、ツリーの非常に下にあり、ルートで互いに迂回している2つのパスの間を行き来しています。cdユーザーが最後のディレクトリに移動するという議論があると、私の人生はずっと楽になるだろうと思います。

つまり、私がいる場合:

/etc/foo/bar/baz/moo

次に入力します:

cd /var/lib/fubarred_app/blargh/logs

パス全体を再度入力することなく、最初のディレクトリに戻ることができるようにしたいと思います。

メモリキーは、各場所で十分なコマンドを使用しているので、それをカットすることはできません。

前のディレクトリに移動するだけの短いコマンドはありますか?


8
@のに加えて、ブライアン『:あなただけのようなものを入力することができるようにの優秀な答えは、あなたは、各パスの別名のペアを作成することを検討可能性があるbazmoo』または『blarghlog:)プロンプトで』
ウォーレン

4
GNU画面を使用しないのはなぜですか?

2
どのシェル?それは大きな違いになります。
ランダルシュワルツ

@warren ditto。それがすべてを行うための私の好ましい方法です。コンピューターの使用目的の半分に独自のエイリアスが
追加されました

Fasdは素晴らしい。見てみな。
-majkinetor

回答:


301

コマンド

cd -

ほとんどのメインストリームシェルで必要なスワップを実行します。古いバージョンは

cd "$OLDPWD"

以前の作業ディレクトリを含む環境変数を使用します。


言及cdPOSIX manページ

記述

上記の手順の実行中にPWD環境変数が変更された場合、OLDPWD環境変数も古い作業ディレクトリ(cdの呼び出しの直前の現在の作業ディレクトリ)の値に変更されます。

オペランド

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

cd "$OLDPWD" && pwd 

前の作業ディレクトリに変更し、その名前を書き込みます。


7
これは実際に使用しているシェルに依存することに注意してください。指定しなかったため、存在しない「ポータブル」な答えを出すのは難しいでしょう。
ランダルシュワルツ

16
@Randall、おそらく、個々のシェルコメントをすべて1つのVoltron-Shell回答にまとめることができます。
-hyperslug

@ランドール。私はbashを使用していました。kshとzshでも動作します。ところで、私は最初に1994年版のLearning Perlからプログラミングを学びました。:)
イツチャク

うーん、私cd $OLDPWDはこれに使用しました。主流のシェルがより短い形式を提供するのは素晴らしいことです。
ulidtko

2
@sinni特定のフレーバーにpushdあり、少なくとも組み込みですbash
-slhck

105

bryanの答えに加えて、スタックのようなディレクトリを構築するpushdand もありpopdます。これはWindows NTでも利用可能です。ただし、すべてのシェルで使用できるわけではありません。

たとえば、3つの異なるディレクトリに移動できます。呼び出したときに常にスタックが表示されますpushd

charon:~ werner$ pushd Documents/
~/Documents ~

charon:Documents werner$ pushd ../Movies/
~/Movies ~/Documents ~

charon:Movies werner$ pushd ../Downloads/
~/Downloads ~/Movies ~/Documents ~

そしてpopd、連続して3回呼び出すと、スタック内のこれらのディレクトリに逆の順序で到達します。同時に、スタックは再び空になります。

charon:Downloads werner$ popd
~/Movies ~/Documents ~

charon:Movies werner$ popd
~/Documents ~

charon:Documents werner$ popd
~

charon:~ werner$ popd
-bash: popd: directory stack empty

Zshを使用している場合; AUTO_PUSHDオプションがあり、これは自動的cdにをスタックにプッシュします。


pushdとpopdは、すべてのシェルで使用できるわけではありません。
ランダルシュワルツ

5
@Wiesław:本当ですか?bashにそれがあればいいのに...もちろん、にエイリアスcdすることもできpushdますが、ほとんど同じです。
クリスチャラバルク

3
または、pdをpushdにエイリアスし、両方を持っています。BTW pushd(または別名でpd)自体は、現在のディレクトリと最後にプッシュされたディレクトリを交換し、本質的に「cd-」の機能を実現します。
Jロバート

私はこのコンセプトは気に入っていますが、慣れていません。
アンデルセン

13

いくつかの「ジャンプ」プログラムがあります

  • 自動ジャンプ(基本機能で維持)
  • j2 (一部の高度な機能では明らかにメンテナンスされていません)
  • z(高度な機能を備えた「j」の維持バージョン)

これらは、あらゆる種類のディレクトリナビゲーションを容易にします。パスの一部を指定して使用すると、機能します。

あなたの場合

~$ j baz 
/etc/foo/bar/baz/moo$

~$ j bla 
/var/lib/fubarred_app/blargh/logs$

これらのプログラムに任意の文字を割り当てることができます。「j」は伝統です:)

j2とzは複数の検索語をサポートしています...

~$ j baz src
/home/me/projects/baz/repository/trunk/src$

...およびその他のオプション。

~$ j -l  # list directories by "frecency"(frequency + recency) score
~$ j -r PATTERN # match by rank only, not recency
~$ j -t PATTERN # match by recency only, not rank

2
「j」は明らかにシェル固有です。あなたはそれを言わなかった。
ランダルシュワルツ

3
@Randal:どのようにシェル固有ですか?それはプログラムです。
フィクシー

3
私はアホです。:)私は今それを見る。
ランダルシュワルツ

10

ほかに cd -cd $OLDPWD

以前に入力しCTRL-Rcdコマンドの数文字を押して入力することにより、履歴検索を使用できます。CTRL-R繰り返し押すと、古いマッチが表示されます。

この方法は、変更するパスが3つ以上ある場合に便利です。


1
CTRL-Rは必ずしも役立つとは限りません。/ some / obscure / directory / deepにいて、「cd evendeeperdir」を実行してから〜/ somehere / differentに移動した可能性があります。
ジャスティンタイム

1
すばらしいです!それは、以外のことにcd役立ちます。
ニロクト

9

これを使用して、ディレクトリのエイリアスを簡単に作成できます。

a() { alias $1=cd\ $PWD; }

a 1

以降:

1

1
エイリアスと関数を理解するシェル上のみ。すべてではありません。
ランダルシュワルツ

だから、これはalias =部品の入力をスキップしますか?うーん
Xen2050

6

bashmarksを使用すると、一連のフォルダーをブックマークして、タブ補完でそれらの間をジャンプできます。

フォルダーをブックマークするには、そのフォルダーに移動して、次のようにブックマークします。

bookmark foo

ブックマークの名前は「foo」になります。そのフォルダに戻りたい場合は、次を使用します。

go foo

ブックマークのリストを表示するには:

bookmarksshow

タブ補完が機能し、shoobieブックマークに移動します:

go sho[tab]

4

別の可能性は、2つのウィンドウを開いたままにして、各ディレクトリに1つのウィンドウを配置することです。


ただし、以前のコマンドを定期的に使用/編集すると、履歴が共有されません(リセットするとコマンドが取得される可能性があります...?)
Xen2050

@ Xen2050 share_historyzsh のシェルオプションを参照してください。
ラドンロズバラ

4

これはあなたの質問に対する厳密な答えではありませんが、あなたを重要なディレクトリ連れて行くという目標を達成するのに役立ちます。

降下UNIX-bashでは、CDPATHを使用して、cdコマンドが検索するフォルダーを拡張できます。

私の.bashrcファイルから:

export CDPATH='.:~/source/'

cdはまず現在のフォルダーを検索し、次にコーディングプロジェクトディレクトリを検索します。

cd myproject

.. 現在立っているところから〜/ sources / myprojectに移動します

ディレクトリナビゲーションを大いに助けてくれたシンプルで小さな機能。


1
+1これにより、CDPATHフォルダーがcdのオートコンプリート(TAB)リストに追加されます。ただし.が含まれておらず、現在のディレクトリにあるフォルダと同じ名前のフォルダがCDPATHフォルダにある場合、現在のディレクトリにあるフォルダではなくcd samenameCDPATHディレクトリに移動します。dupフォルダに入るために使用する必要があります。cd ./samename
Xen2050

うん、いいコメント。常に最初を含めますまたは、奇妙なものが発生します。
-phareim

3

うん、cd -行く方法ですが、私はあなたのシェルに持っている力の不足を心配しています。 popdそしてpushdまた良いです、そして、そのjこともよさそうです。

私は自分のユーティリティをリングに入れます...それは私が過去10年ほどの間私と一緒に構築、カスタマイズ、移行してきたもので、それは私がやりたいことのためにうまく機能します。

ディレクトリ管理ユーティリティのブログ投稿

それがあなたのために働くなら、それから素晴らしいですが、それが私に約束しないなら、あなたは何か他のものを手に入れるでしょう:)あなたは単にcd一人で暮らすことはできません。


3

2つのディレクトリしかない場合、最も簡単な方法は、前述のとおり、

cd -

過去にそのようなことがあったとき、私がやったいくつかのトリックがありました、それは役に立つかもしれません。

  1. エイリアスコマンドを.cshrcファイルに入れます。次のようなものです。

    alias moo /etc/foo/bar/baz/moo  
    alias logs cd /var/lib/fubarred_app/blargh/logs
    
  2. ホームディレクトリから目的のパスへのショートカットをリンクします。これは一度きりです。

    cd ~
    ln -s /var/lib/fubarred_app/blargh/logs blargh
    ln -s /etc/foo/bar/baz/moo
    

これにより、次のように簡単にディレクトリを変更できます。

   cd ~/moo
   cd ~/blargh

2

Autojumpはbash / sh / zsh "cd"コマンドであり、アクションからこのビデオを参照してください。

そのため、最後のフォルダを学習した後、mooに移動します

j moo

2

ビーム

私は自分のツールを持っていますが、Dereksツールjも見ていきます。

もちろん、前後にジャンプするための最初の選択肢は

cd-

私のツールは、locate利用可能なシステム上で一意の名前を持つディレクトリを対象としています。一致するディレクトリ名を検索し、最初の一致にジャンプします。

beam () 
{ 
    ldir=$(locate $1 | egrep "$1$" | head -n 1);
    if [[ -d $ldir ]]; then
        echo $ldir;
        cd $ldir;
    else
        echo "no directory "$ldir;
    fi
}

依存関係:

  • 見つける
  • grep

欠点:

  • 最後に更新されたb-runよりも新しいディレクトリが見つかりません
  • 複数のディレクトリが一致する場合、それはあなたが念頭に置いていたものに輝いているかどうか、あなたの運次第です。

改善/修正:

  • 最初のディレクトリを選択する代わりに、コードを変更して選択肢のリストを表示し、ユーザーに1,2,3、...を入力して/ bin、/ usr / bin、/ usr / local / binに移動するように求めることができます。 ...

使用法:

  • /etc/bash.bashrcまたは〜/ .bashprofileに関数を配置して、便利な方法で使用します。

私のソリューションの利点:

  • 次のような2つのディレクトリに限定されません cd -
  • ビームを使用する前に、一度ディレクトリにアクセスする必要はありません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.