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

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

EDIT :これらのコマンドの両方の使用例、またはディレクトリとスタックを維持する理由(タブ補完がある場合、cd -、短縮のエイリアスcd ..など)。

回答

pushd popd 、および dirs は、シェル組み込みであり、 ディレクトリスタックを操作できます。これを使用してディレクトリを変更できますが、元のディレクトリに戻ります。

たとえば

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

$ pwd /home/saml/somedir $ ls dir1 dir2 dir3 

dir1にプッシュ

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

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

../dir3にプッシュされます(現在はdir1内にあるため)

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

dirsは、スタックに3つのディレクトリがあることを示しています。dir3dir1、および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

少し混乱するかもしれませんが、スタックの頭kは、現在いるディレクトリです。したがって、somedirに戻ると、dirsに次のように表示されますが、

$ dirs ~/somedir 

スタックは実際には空です。

$ popd bash: popd: directory stack empty 

コメント

  • ありがとうございます。スタックの概念と、このコマンドがどのように機能するかを完全に理解しています。ただし、’ディレクトリとスタックを維持するための実用的な理由を探しています(タブ補完がある場合、cd -、短縮用のエイリアスcd ..など)。
  • よく使用するのはpushd &スクリプトb / cのpopdを使用すると、どこから来たのかを覚えておく必要がなくなります。いつでもpopdから戻ることができます。私が来た場所。私は通常、popd >/dev/null 2>&1を実行してサイレントにします。私は毎日cd-をシェルで使用しています。この記事には、他にも時間節約のヒントがいくつかあります: thegeekstuff.com/2008/10/ …
  • @ Garrett-私が想像できることはありません。
  • cd -は最後のディレクトリのみを追跡するため、@ Garrett @ slmです。内部的にディレクトリも変更する関数を呼び出すと、問題が発生する可能性があります。その場合、関数は、ポップバックするディレクトリではなく、現在のディレクトリにリセットされることになります。 pushd / popdが最も安全な方法です。注:’理論をテストしていません。
  • 最初のivの後に~/somedir/dir3に戻らないのはなぜですか。 id = “9a953f50f0”>

回答

pushdおよびpopdコマンドの非常に便利な使用例複数のフォルダを同時に操作する場合。

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

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


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

 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" 

コメント

  • そして、dirs -c
  • +1でスタックをクリアできます。実際にいくつかの実用的な例を挙げています。 ‘は、pushd / popdがmanページから何をするかを簡単に確認できますが、dirsとcd〜#は最初はわかりません。
  • 使用することもできます。代わりに、この種のワークフローのfasdのようなソリューションですが、
  • @Jun、’ s ” mkdir dir {1,2,3} “で3つのディレクトリを一度に作成できます。
  • @JunMurakami今年は私の年になりました! Happy 2020!

回答

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

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

コメント

  • これは私が最も頻繁に利用する機能だと思います。 pushd / popdcdから独立して動作するため、より安定したものとして使用できます。 cd -よりブックマーク。
  • 私にとってこれは真実ではありません。 cdを使用するたびに、スタックが変更されます。
  • zshを使用するのは大変でしたが、bashに変更すると、正常に機能します
  • これが比較に関する唯一の実質的な答えです。 cd-、IMO付き。 fooをプッシュしたかどうかについて。 <ランダムなディレクトリ変更>; popdはa = fooよりも価値があります。 cd $ a; <ランダムなディレクトリ変更>; cd $ a …スクリプトの場合、前者(pushd)では構文上の利便性はわずかですが、後者([explicit]変数!)では明瞭さが大幅に向上しています。インタラクティブセッションの場合、そもそもディレクトリ階層が適切に整理されていると思います。迷子になった場合は、cd〜 / back / to / obvious / pathを実行してください。
  • @HarendraSingh ‘ AUTO_PUSHDが設定されていませんか? cdpushdのように動作し、設定を解除すると、’に戻ります。 “通常の動作”。

回答

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

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

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

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

回答

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

pushd /home; pushd /var; pushd log 

スタックを表示するには、

およびナビゲーションを簡単にするため(” stack-entries “の番号を取得するには:

dirs -v 

出力:

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

次に、これらの数値をと~のように:

cd ~1 

ただし、これらの番号は現在再配置されており、” 0 “が変更されるため、ディレクトリを2回pushd上の位置に移動します(または位置0のダミー)のように:

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

これで1..3はその位置を保持します

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

回答

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

別の見方をします:

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

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

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

したがって、最も一般的な2つの使用例は次のとおりです。

使用例1:プッシュとポップを使用してナビゲートする

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 

「ドキュメント化」という言葉を使用するか、dirスタックをある種のDbが単純化するものとして考えてください。コンセプト!

回答

簡単に言えば、3つ以上のディレクトリ間を移動する必要がある場合、通常は数回戻る&は、cd -が2つのフォルダを超えるもので切り取られないためです。

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

組み込み機能を使用すると、スタックを並べ替えたり、不要になったディレクトリをポップアウトしたりできるため、ワークフローに柔軟性を持たせることができます。

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

回答

I 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。」をエイリアスして、いつでもどこでもそのディレクトリを復元します。「del。」は対応するファイルを削除します。 「home。」はディレクトリをホームディレクトリに設定します(cd; p。と同等)。「cdl」は保存されたディレクトリを一覧表示します。〜 / Dropbox / .mydir $ b(またはその他のクラウドサービスなど)を使用する場合は注意してください。例:ownCloud)〜/ .mydir $ bの代わりに、スマートな方法が得られますさまざまなアカウントやマシンで好みのディレクトリを使用するには。

回答

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

pushdを使用すると、任意の数のディレクトリをワーキングセットに保持できます。

ほとんどの場合、cdではなくpushdを使用します。 pushd directory_nameを使用してアクティブディレクトリのスタックを構築したら、pushd ~#を使用してそれらの間を1日中ジャンプできます。

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 

それ以外の場合は、iv id = “bc4f8b844bを置き換えるだけです。 tcshで使用する=を使用したbashの例の “>

pushd =2 popd =4 popd +1 

回答

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

divを使用してpushdではなくpopdを使用できるようになることを願っています>

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です