web-dev-qa-db-ja.com

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

これらの2つのコマンドをpushdおよびcd -よりも使用する利点がある場合、popdcdの両方の実際的な用途は何ですか?

[〜#〜] edit [〜#〜]:これらのコマンドの両方の実際的な使用例や、ディレクトリとスタックを保持する理由(タブ補完がある場合はcd -cd ..を短縮するためのエイリアスなど)。

366
syntagma

pushdpopd 、および dirs は、 ディレクトリスタック 。これは、ディレクトリを変更するために使用できますが、元のディレクトリに戻ります。

例えば

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

$ ls
dir1  dir2  dir3

dir1にプッシュ

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

dirsコマンドは、スタックに2つのディレクトリがあることを確認します。 dir1と元のディレクトリsomedir注:「現在の」ディレクトリは~/somedir/dir1です。

../dir3にpushd(今はdir1内にいるため)

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

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

ディレクトリを手動で../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
333
slm

pushdおよびpopdcommandsは、複数のフォルダを同時に操作するための非常に便利な使用例です。

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

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


まず、フォルダ構造の例を作成しましょう。

    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"
213
Jun Murakami

Dirsスタックを使用する簡単な使用例の1つは、cdだけでは実行できないことです。

pushd .は、現在のディレクトリXXをdirsスタックに追加します。その後、cdを使用して移動できます。XXに戻るには、ディレクトリツリーでの距離に関係なくpopdを実行します(複数のレベルを飛び越えたり、横向きにジャンプしたりできます) )。特にbashスクリプトで役立ちます。

pushdおよびpopdを使用すると、スタック上のディレクトリを操作できます。

ディレクトリをpushdするときは、現在のディレクトリをスタックに置き、ディレクトリをパラメータとして指定したディレクトリに変更します。

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

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

10
unxnut

bashの場合、基本的に:cdを使用する代わりにpushdを使用してディレクトリを変更できます。実用的な使用方法:訪問したディレクトリの履歴が保存され(正しく:スタックされ)、切り替えることができます。それらの間の

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を使用します)

8
eli

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

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

現在、私は2つのディレクトリdir1dir2があるsomedirにいます:

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ディレクトリに戻って、変更を加えてアプリケーションをビルドする必要があります。

5
Varun Risbud

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

別の見方をします。

pushd [folder_name]-cdして[folder_name]に移動しますdocument dirスタックの[folder_name]である宛先ですが、スタックの最上位ディレクトリは常に現在のディレクトリ

popd-最初にスタックの最上位にあるディレクトリレコードにcdし、次にドキュメントを削除します(dirスタックから削除します)。

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を使用してpushしたとしましょう。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スタックについて考えたりしてください。

4
Mercury

簡単に言えば、2つ以上のディレクトリ間を移動する必要がある場合は、通常、cd -は、2つのフォルダ以外では何も切りません。

したがって、たとえば、バッファーの履歴を調べたり、長い経路をタブで補完したりして、以前の長い経路に戻ろうとする代わりに、重要な経路を積み重ね、必要に応じて、番号だけで経路に移動できます。複雑なディレクトリ構造と長いパスの間を回転することは、滑らかでスウィフトになります。

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

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

3
elig

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をホームディレクトリに設定します(cdと同等、p。); 「cdl」は、保存されているディレクトリをリストします。 〜/ .mydir $ bの代わりに〜/ Dropbox/.mydir $ b(またはownCloudなどの他のクラウドサービス)を使用すると、異なるアカウントやマシンで優先ディレクトリを使用するスマートな方法が得られることに注意してください。

2
Vitelot

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

tcshbashは不可)では、ディレクトリスタックをファイルに保存して、後で復元することもできます。

セーブ:

dirs -S ~/dirstack

戻す:

dirs -L ~/dirstack

それ以外の場合は、bashの例の~=に置き換えて、tcshで使用します。

pushd =2
popd =4
popd +1
1
jskroch

私はこれを私の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

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

1
Ankur Jain