これらの2つのコマンドをpushd
およびcd -
よりも使用する利点がある場合、popd
とcd
の両方の実際的な用途は何ですか?
[〜#〜] edit [〜#〜]:これらのコマンドの両方の実際的な使用例や、ディレクトリとスタックを保持する理由(タブ補完がある場合はcd -
、cd ..
を短縮するためのエイリアスなど)。
pushd
、 popd
、および dirs
は、 ディレクトリスタック 。これは、ディレクトリを変更するために使用できますが、元のディレクトリに戻ります。
$ ls
dir1 dir2 dir3
$ pushd dir1
~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir1 ~/somedir
dirs
コマンドは、スタックに2つのディレクトリがあることを確認します。 dir1
と元のディレクトリsomedir
。 注:「現在の」ディレクトリは~/somedir/dir1
です。
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
pushd
およびpopd
commandsは、複数のフォルダを同時に操作するための非常に便利な使用例です。
スタックは列挙されているため、非常に簡単にナビゲートできます。つまり、作業中に自由に使用できるいくつかの作業フォルダを持つことができます。
以下の簡単な例を参照してください。
まず、フォルダ構造の例を作成しましょう。
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スタックを使用する簡単な使用例の1つは、cdだけでは実行できないことです。
pushd .
は、現在のディレクトリXXをdirs
スタックに追加します。その後、cd
を使用して移動できます。XXに戻るには、ディレクトリツリーでの距離に関係なくpopd
を実行します(複数のレベルを飛び越えたり、横向きにジャンプしたりできます) )。特にbashスクリプトで役立ちます。
pushd
およびpopd
を使用すると、スタック上のディレクトリを操作できます。
ディレクトリをpushd
するときは、現在のディレクトリをスタックに置き、ディレクトリをパラメータとして指定したディレクトリに変更します。
popd
を使用すると、スタック上のディレクトリに戻ることができます。
繰り返すと、ディレクトリトラバーサルは一種の保存され、保存したディレクトリとは逆の順序で保存したディレクトリに戻ることができます。
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
を使用します)
私が見つけた実用的な用途の1つは、pushdとpopdを使用してディレクトリを切り替えることです。
2つのディレクトリdir1とdir2があり、何らかのxyzの理由でそれらを継続的に切り替える必要があるとします。
現在、私は2つのディレクトリdir1
とdir2
がある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$
ご覧のとおり、スタックにdir2
とdir1
があり、現在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ディレクトリに戻って、変更を加えてアプリケーションをビルドする必要があります。
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スタックについて考えたりしてください。
簡単に言えば、2つ以上のディレクトリ間を移動する必要がある場合は、通常、cd -
は、2つのフォルダ以外では何も切りません。
したがって、たとえば、バッファーの履歴を調べたり、長い経路をタブで補完したりして、以前の長い経路に戻ろうとする代わりに、重要な経路を積み重ね、必要に応じて、番号だけで経路に移動できます。複雑なディレクトリ構造と長いパスの間を回転することは、滑らかでスウィフトになります。
ビルトインを使用すると、スタックの順序を変更したり、不要になったディレクトリをポップアウトしたりして、ワークフローの柔軟性を高めることができます。
ディレクトリのスタッキングは、複数のディレクトリにまたがる操作のスクリプトでも同様に使用できます。
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などの他のクラウドサービス)を使用すると、異なるアカウントやマシンで優先ディレクトリを使用するスマートな方法が得られることに注意してください。
cd
とcd -
を使用すると、最近使用した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
私はこれを私の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を使用するのに役立つことを願っています