pushdおよびpopdコマンドを使用するにはどうすればよいですか?


332

何の両方の実用化されているpushdpopdオーバーこれらの2つのコマンドを使用する利点がある場合cdとはcd -

編集:私はこれらのコマンドの両方の実用的な使用例やディレクトリとスタックを保持する理由を探しています(タブ補完、cd -短縮のエイリアスcd ..などがある場合)。

回答:


304

pushdpopddirsあなたが操作できるようにシェルの組み込みコマンドですディレクトリスタックを。これを使用してディレクトリを変更できますが、元のディレクトリに戻ります。

例えば

次のディレクトリで起動します。

$ ls
dir1  dir2  dir3

dir1にプッシュ

$ pushd dir1
~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir1 ~/somedir

dirsコマンドは、スタック上に2つのディレクトリがあることを確認します。dir1元のディレクトリsomedir

../dir3にプッシュされました(dir1今は内部にいるため)

$ pushd ../dir3
~/somedir/dir3 ~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir3 ~/somedir/dir1 ~/somedir
$ pwd
/home/saml/somedir/dir3

dirsスタックに3つのディレクトリがあることを示しています。dir3、、dir1およびsomedir。方向に注意してください。すべての新しいディレクトリが左側に追加されています。ディレクトリをポップオフし始めると、それらも左から来ます。

手動でディレクトリを変更します ../dir2

$ cd ../dir2
$ pwd
/home/saml/somedir/dir2
$ dirs
~/somedir/dir2 ~/somedir/dir1 ~/somedir

ディレクトリのポップを開始します

$ popd
~/somedir/dir1 ~/somedir
$ pwd
/home/saml/somedir/dir1

に戻ったことに注目してくださいdir1

再びポップ...

$ popd
~/somedir    
$ pwd
/home/saml/somedir

そして、私たちは始めたところに戻りましたsomedir

少し混乱するかもしれないが、スタックの頭は、あなたが現在いるディレクトリであるかもしれないしたがって、我々は戻って得るとき。somedir、にもかかわらずdirsショーこの:

$ dirs
~/somedir

スタックは事実上空です。

$ popd
bash: popd: directory stack empty

19
おかげで、私はスタックの概念とこのコマンドがどのように機能するかを完全に理解しています。ただし、スタックをディレクトリに保持する実用的な理由を探しています(タブ補完cd -、、短縮のエイリアスcd ..などがある場合)。
シンタグマ

21
私は頻繁に使うpushdpopdB / C彼らは私がから来ていたところ、私はいつもちょうどすることができます覚えていることから私を保存するスクリプトではpopd、私が来たところから戻って取得します。私は通常popd >/dev/null 2>&1、それを黙らせます。私はシェルで毎日cd-を使用しています。この記事では、いくつかの他の時間節約のヒントにもありますthegeekstuff.com/2008/10/...
slm

2
@Garrett-私が想像できるものはありません。
slm

4
@Garrett @slm cd -は最後のディレクトリのみを追跡するため、ディレクトリを内部的に変更する関数を呼び出すと問題が発生する可能性があると思います。その場合、関数はリセットされてしまいます-ポップしたいディレクトリではなく、現在のディレクトリに。pushd / popdは最も安全な方法です。注:私は自分の理論をテストしていません。
バイナリフィール14年

5
~/somedir/dir3最初の後に戻ってみませんpopdか?
ziyuang

198

あるために本当に便利なユースケースpushdpopdコマンドを同時にいくつかのフォルダでの作業のために。

スタックは列挙されているため、非常に簡単にナビゲートできます。つまり、作業中にいくつかの作業フォルダーを自由に使用できます。

以下の簡単な例を参照してください。


まず、サンプルのフォルダー構造を作成しましょう。

    user@vb:~$ mkdir navigate
    user@vb:~/navigate$ mkdir dir1
    user@vb:~/navigate$ mkdir dir2
    user@vb:~/navigate$ mkdir dir3

次に、すべてのフォルダーをスタックに追加できます。

    user@vb:~/navigate$ pushd dir1/
    ~/navigate/dir1 ~/navigate
    user@vb:~/navigate/dir1$ pushd ../dir2/
    ~/navigate/dir2 ~/navigate/dir1 ~/navigate
    user@vb:~/navigate/dir2$ pushd ../dir3/
    ~/navigate/dir3 ~/navigate/dir2 ~/navigate/dir1 ~/navigate

次の方法で検索できます。

    user@vb:~/navigate/dir3$ dirs -v
     0  ~/navigate/dir3
     1  ~/navigate/dir2
     2  ~/navigate/dir1
     3  ~/navigate

安全にナビゲートするには、常に書き換えられるため、最後の(ゼロ)フォルダーを2回追加する必要があります。

    user@vb:~/navigate/dir3$ pushd .
    user@vb:~/navigate/dir3$ dirs -v
     0  ~/navigate/dir3
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate

これで、これらのフォルダーをジャンプして、フォルダーのエイリアスと同様にスタックを操作できます。次の部分は自明だと思います。

    user@vb:~/navigate/dir3$ cd ~4
    user@vb:~/navigate$ dirs -v
     0  ~/navigate
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate
    user@vb:~/navigate$ cd ~3
    user@vb:~/navigate/dir1$ dirs -v
     0  ~/navigate/dir1
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate
    user@vb:~/navigate/dir1$ touch text.txt
    user@vb:~/navigate/dir1$ cp text.txt ~2
    user@vb:~/navigate/dir1$ ls ~2
    text.txt
    user@vb:~/navigate/dir1$ dirs -v
     0  ~/navigate/dir1
     1  ~/navigate/dir3
     2  ~/navigate/dir2
     3  ~/navigate/dir1
     4  ~/navigate

追加のヒントは、のエイリアスを作成することですdirs -v

例えば:

# In ~/.bashrc
alias dirs="dirs -v"

28
スタックをクリアするにはdirs -c
村上純

19
実際にいくつかの実用的な例を挙げて+1。pushd / popdの動作はmanページから簡単にわかりますが、dirsとcd〜#は最初は明らかではありません。
Scribblemacher

代わりに、この種のワークフローにfasdのようなソリューションを使用することもできます
-WuTheFWasThat

したがって、CDPATHを設定するよりも一時的なユースケースに適していますか?
rfabbri

2
@Jun、「mkdir dir {1,2,3}」があり、3つのディレクトリを一度に作成します。
ブラットM.

39

dirsスタックを使用するための1つの単純な使用例は、cdだけではできないことです。

pushd .現在のディレクトリXXをdirsスタックに追加します。その後、を使用して移動でき、ディレクトリツリー内の「遠く」に関係なく、cdXXに戻るだけですpopd(複数のレベルを横に飛び越えることができます)。特にbashスクリプトで役立ちます。


2
これは私が最もよく利用する機能だと思います。pushd/ popdworkはから独立しているためcdcd -
ゴードンBean

私にとってこれは真実ではありません。cdを使用するたびにスタックが変更されます。
ハレンドラシン

ああ、それはzshを使用することのcozでした、bashに変更するとき、それはうまく働きます
ハレンドラシン

4
これは、cd-、IMOとの比較に関して唯一の実質的な答えです。fooをプッシュしたかどうかについて; <ランダムなディレクトリ変更>; popdはa = fooよりも価値があります。cd $ a; <ランダムなディレクトリ変更>; cd $ a ...スクリプトについては、前者(pushd)の構文上の利便性はわずかですが、後者([explicit]変数!)の明確さは大幅に向上しています。対話型セッションの場合、最初にディレクトリ階層が適切に編成されていると仮定し、迷った場合は単にcd〜/ back / to / obvious / pathを紛失したと思います。
月きゅうPeblik

9

pushdそしてpopdあなたは、スタック上のディレクトリを操作することができます。

あなたの場合はpushd、ディレクトリには、パラメータとして指定されたものにスタックし、変更のディレクトリにカレントディレクトリを置きます。

popd スタック上のディレクトリに戻ることができます。

繰り返すと、ディレクトリトラバーサルは保存されたままになり、保存したディレクトリと逆の順序で保存されたディレクトリに戻ることができます。


6

以下のためにbashの、基本的には:代わりにCD 1を使用しての使用することができますpushd訪問したディレクトリの履歴が保存されます(正確に::スタック)の実用的な使い方で、directorysを変更すると、1はそれらを切り替えることができます

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


5

私が見つけた実用的な用途の1つは、pushdとpopdを使用してディレクトリを切り替えることです。

dir1とdir2の2つのディレクトリがあり、xyzの理由でそれらを連続的に切り替える必要があるとします。

現在、私は2つのディレクトリを持ってsomedirで午前dir1dir2

alcohol@alcohol-machine:~/somedir$ ls
dir1  dir2
alcohol@alcohol-machine:~/somedir$ 

今、私はに切り替えます dir1

alcohol@alcohol-machine:~/somedir$ cd dir1
alcohol@alcohol-machine:~/somedir/dir1$ pwd
/home/alcohol/somedir/dir1

今、私はdir1スタックに追加し、に切り替えますdir2

alcohol@alcohol-machine:~/somedir/dir1$ pushd /home/alcohol/somedir/dir2
~/somedir/dir2 ~/somedir/dir1
alcohol@alcohol-machine:~/somedir/dir2$

あなたが見ることができるように、私が今持っているdir2dir1、スタック上、私は現在にしていますdir2

今に戻るためにdir1、私は走りpushd || popdます。

alcohol@alcohol-machine:~/somedir/dir2$ pushd || popd
~/somedir/dir1 ~/somedir/dir2
alcohol@alcohol-machine:~/somedir/dir1$ 

出来上がり、私はdir1にあり、スタックにdir1とdir2があります。再びdir2に切り替えるには、次を実行しますpushd || popd

alcohol@alcohol-machine:~/somedir/dir2$ pushd || popd
~/somedir/dir1 ~/somedir/dir2
alcohol@alcohol-machine:~/somedir/dir1$ 

これはディレクトリを切り替える簡単な方法です。さて、あなたは何を知っているかもしれません、なぜディレクトリを切り替える必要があるのですか?1つのユースケースは、Webアプリケーションで作業するとき、1つのディレクトリにメイクファイルがあり、ログファイルが別のディレクトリにあることです。多くの場合、アプリケーションをデバッグするとき、ログディレクトリを切り替えて、最新のログを確認し、makeディレクトリに戻って、変更を加えてアプリケーションをビルドする必要があります。


11
(1)質問は「の利点は何である、頼むpushdpopdオーバーはcd -?」何をするのかを正確に説明しているので、明らかにその質問には答えてcd -いません。(2)言いpushd || popdたいことは何ですか?はい、それcmdA || cmdBは実行を意味cmdAし、それが失敗した場合は実行することを知っていますcmdB。私はこの文脈でそれが何をするのか尋ねています。  pushd引数なしの場合、「ディレクトリスタックの上の2つの要素を入れ替える」ことを意味します。現在のディレクトリがディレクトリスタック上の唯一の要素である場合、失敗します。その場合popdも失敗します。
G-マン

3
誰もあなたを支持していないなんて信じられない!命の恩人!なんて素晴らしいハック。ありがとう。私の意見ではトグル、のためのユースケースと。pushdpopd
ソニー

3
pushd || popdディレクトリを切り替えるよりもはるかに少ない入力を必要とする2つの明確な方法がありますpushd。引数なしでこれを行うだけです。cd -最後のディレクトリに切り替えるためだけに明示的に存在します。さらに、質問はpushdover の利点を求めましたがcd -、この回答は明らかに不利な点のみを提供します:より多くのタイピング。
ベンジャミンリッグス

bashでは、引数なしでpushdは上位2つのディレクトリを交換し、0を返します。なぜ|| popdトグルが必要なのですか?説明してください。(十分にプッシュされていませんか?)
ジョニーウォン

@Sonny cd -2つのディレクトリを切り替えるためだけに使用します。さらにcd、引数なしでホームディレクトリに戻ります。
スティーブ

2

簡単に言えば、2つ以上のディレクトリ間を移動する必要がある場合、通常は数回前後に移動しcd -ます。2つのフォルダを超えるとカットされないからです。

そのため、たとえば、バッファーの履歴を確認したり、長いパスをタブで補完して以前の長いパスに戻ろうとする代わりに、重要なパスを単純に積み重ね、必要に応じて番号だけでそれらに移動できます。複雑なディレクトリ構造と長いパスの間を回転すると、滑らかで迅速になります。

ビルトインを使用すると、スタックの順序を変更したり、不要になったディレクトリをポップアウトしたりして、ワークフローを柔軟にすることもできます。

ディレクトリスタッキングは、複数のディレクトリにまたがる操作のスクリプトでも同様に使用できます。


1

dirs / popd / pushdの使用が少し不快であることがわかりました。次のコードを.aliasに追加することにより、tcshで個人的なソリューションを思い付きました。

  foreach b (. , - 0 1 2 3 4 5 6 7 8 9 )
    alias p$b       'set a=`pwd`; echo $a >! ~/.mydir'$b
    alias cd$b      'cd "`cat ~/.mydir'$b'`"'
    alias del$b     'rm -v ~/.mydir'$b
    alias home$b    'set a="~"; echo $a >! ~/.mydir'$b
  end
    alias cdl       'grep / ~/.mydir*'

このようにして、たとえば「p」というエイリアスを作成しました。現在の作業ディレクトリをファイル〜/ .mydirに保存します。および「cd」。いつでもどこでもそのディレクトリを回復します。「デル」対応するファイルを削除します。「家」dirをホームdirに設定します(cdと同等; p。); 「cdl」には、保存されたディレクトリがリストされます。〜/ .mydir $ bの代わりに〜/ Dropbox / .mydir $ b(または、ownCloudのような他のクラウドサービス)を使用する場合、異なるアカウントとマシン間で好みのディレクトリを使用するスマートな方法が得られることに注意してください。


0

私はbash_profileと.bashrcでこのように使用しています

vi .bash_profile
alias dirs="dirs -v"
source d.sh
:wq

vi .bashrc
alias dirs="dirs -v"
:wq

vi d.sh
pushd ~/Documents/GIT/seiso-data
pushd ~/Documents/GIT/ewe/EosRegistry
pushd ~/Documents/GIT_LODGING/site-cookbooks
pushd ~/Documents/CHEF_LODGING
pushd  .
:wq

ディレクトリ間を移動して、端末で最近使用したディレクトリに移動するのに役立ちます。:-) pushdではなくpopdを使用するのに役立つことを願っていますcd〜stackednumberを使用します


0

を使用するcdcd -、最近使用した2つのディレクトリのみを切り替えることができます。「ディレクトリワーキングセット」のサイズは2です。

を使用するとpushd、作業セットに任意の数のディレクトリを保持できます。

私はpushdほとんどの時間よりむしろ時間を使いますcd。でアクティブなディレクトリのスタックを作成しpushd directory_nameたら、で一日中それらの間をジャンプできますpushd ~#

pushd dir1
pushd ../dir2
pushd /full/path/to/dir3

# There are now three directories in the stack.

pushd ~3
pushd ~2

# The same three directories are still on the stack, 
# just in a different order.

私はpopdめったに使用しません。スタックからディレクトリを削除したい場合にのみ、そのディレクトリの使用が終了したことがわかっています。

ディレクトリに移動して、スタックから削除します。

popd ~2

現在のディレクトリにとどまり、スタックから別のディレクトリを削除します。

popd +2

最終的には、複数のターミナルウィンドウまたはタブ(アクティブに作業しているディレクトリごとに1つ)を開くのと同様の作業スタイルになりますが、すべて1つのターミナルにあります。これにより、画面のスペースを節約できます。さらに、ディレクトリパスはすべて1つのシェルで使用できるため、次のようなことができます。

  • 現在作業しているディレクトリ間でファイルをコピーします
  • そこに行かずに別のディレクトリのファイルを表示または編集する

例:

cp ~2/myfile.txt ~4
less ~2/myfile.txt

ではtcsh(ではないbash)、あなたも、ファイルへのディレクトリ・スタックを保存し、後でそれを復元することができます。

セーブ:

dirs -S ~/dirstack

戻す:

dirs -L ~/dirstack

それ以外の場合~は、bash例のを=で使用するために置き換えてくださいtcsh

pushd =2
popd =4
popd +1

0

pushd / popdは非常に単純な概念で、これらのコマンドを「ディレクトリスタックを操作する」コマンドとして定義することで教える傾向があるため、理解するのにしばらく時間がかかりました。

別の方法で見ます:

pushd [folder_name] - [folder_name]にcd し、dirスタックの[folder_name]である宛先を文書化しますが、スタックの最上位ディレクトリは常に現在のdirになります。

popd-最初にスタックの一番上にあるディレクトリレコードに移動し、スタックから削除します

dirs -dirスタックを出力します(左端のエントリが現在のディレクトリ(スタックの最上部)であるdir Dbとして扱うことができます)

したがって、最も一般的な2つのユースケースは次のとおりです。

ユースケース1: pushdとpopdを使用してナビゲートする

root@mypc:/main/$ ls
dir1  dir2  dir3  dir4

root@mypc:/main/$ dirs   # prints the current stack
/main

root@mypc:/main/$ pushd dir1    # Will cd to dir1 and document dir1 in dir stack, stack is now:
/main/dir1 /main 
root@mypc:/main/dir1$    # I am now in /main/dir1

root@mypc:/main/dir1$    # Now let's go wild and document whatever I want
root@mypc:/main/dir1$ pushd ../dir2 
root@mypc:/main/dir2$     # Woo I am in /main/dir2
root@mypc:/main/dir2$ pushd ../dir3 
root@mypc:/main/dir3$     # Woo I am in /main/dir3
root@mypc:/main/dir3$ pushd ../dir4 
root@mypc:/main/dir4$     # Woo I am in /main/dir4
root@mypc:/main/dir4$ dirs   # Now dir stack is:
/main/dir4 /main/dir3 /main/dir2 /main/dir1 /main

文書化したフォルダに戻りたいので、上記を実行したとしましょう。

手動でcdを実行すると、一番上のディレクトリスタックエントリ(常に現在のディレクトリ)に影響することに注意してください。

root@mypc:/main/dir4$ cd ..   # Now dir stack is:
# (note that /main appear in the leftmost as well which is the top of the stack)
/main /main/dir3 /main/dir2 /main/dir1 /main
root@mypc:/main$ 

後方に移動しましょう:

root@mypc:/main$ popd
root@mypc:/main$     # Still in /main since it was at the top of the dir stack
root@mypc:/main$ dirs    # Stack is now:
/main/dir3 /main/dir2 /main/dir1 /main

root@mypc:/main$ popd
root@mypc:/main/dir3$ popd    # Woo in dir3 now, about to navigate to dir2
root@mypc:/main/dir2$ popd    # Woo in dir2, about to navigate to dir1
root@mypc:/main/dir1$ dirs    # Stack is now:
/main

繰り返しますが、任意のディレクトリをドキュメント化し、別のディレクトリに手動で移動すると、スタックに挿入したドキュメント化されたディレクトリに簡単に戻ることができます。

ユースケース2:数値スタックインデックスを使用したナビゲーション

pushd dir4 dir3 dir2 dir1を使用してプッシュした場合、dir -vを実行すると次のように表示されます。

root@mypc:/main$ dirs -v
 0  /main/dir1  (this is the current dir you are in always)
 1  /main/dir2
 2  /main/dir3
 3  /main/dir4

これで、スタックインデックスを使用したディレクトリを含むLinux操作を実行できます。

root@mypc:/main$ cp ~2/temp.txt ~3/new_temp.txt    # this will run in the background, something like:
# cp /main/dir2/temp.txt  /main/dir3/new_temp.txt

dirスタックから特定のエントリを削除することもできます。

root@mypc:/main$ popd ~4

「文書化」という言葉を使用するか、ある種のDbが概念を単純化するように、dirスタックについて考えてください。

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